Commit a59d15cf by Alexandre Oliva Committed by Alexandre Oliva

re PR debug/47498 (-fcompare-debug failure with -fsched2-use-superblocks)

gcc/ChangeLog:
PR debug/47498
PR debug/47501
PR debug/45136
PR debug/45130
* haifa-sched.c (get_ebb_head_tail): Move notes across boundary
debug insns.
(no_real_insns_p, schedule_block, set_priorities): Drop special
treatment of boundary debug insns.
* sched-deps.c (sd_init_insn, sd_finish_insn): Don't mark debug
insns.
* sched-ebb.c (schedule_ebbs): Adjust skipping of debug insns.
* sched-int.h (DEBUG_INSN_SCHED_P): Remove.
(BOUNDARY_DEBUG_INSN_P): Likewise.
(SCHEDULE_DEBUG_INSN_P): Likewise.
* sched-rgn.c (init_ready_list): Drop special treatment of
boundary debug insns.
* final.c (rest_of_clean_state): Clear notes' BB.
gcc/testsuite/ChangeLog:
PR debug/47498
PR debug/47501
PR debug/45136
PR debug/45130
* debug/pr47498.c: New.
* debug/pr47501.c: New.

From-SVN: r169513
parent 6fc2f091
2011-02-02 Alexandre Oliva <aoliva@redhat.com>
PR debug/47498
PR debug/47501
PR debug/45136
PR debug/45130
* haifa-sched.c (get_ebb_head_tail): Move notes across boundary
debug insns.
(no_real_insns_p, schedule_block, set_priorities): Drop special
treatment of boundary debug insns.
* sched-deps.c (sd_init_insn, sd_finish_insn): Don't mark debug
insns.
* sched-ebb.c (schedule_ebbs): Adjust skipping of debug insns.
* sched-int.h (DEBUG_INSN_SCHED_P): Remove.
(BOUNDARY_DEBUG_INSN_P): Likewise.
(SCHEDULE_DEBUG_INSN_P): Likewise.
* sched-rgn.c (init_ready_list): Drop special treatment of
boundary debug insns.
* final.c (rest_of_clean_state): Clear notes' BB.
2011-02-01 Joseph Myers <joseph@codesourcery.com> 2011-02-01 Joseph Myers <joseph@codesourcery.com>
* config/openbsd.opt (assert=): New Driver option. * config/openbsd.opt (assert=): New Driver option.
......
...@@ -4402,7 +4402,11 @@ rest_of_clean_state (void) ...@@ -4402,7 +4402,11 @@ rest_of_clean_state (void)
if (LABEL_P (insn)) if (LABEL_P (insn))
INSN_UID (insn) = CODE_LABEL_NUMBER (insn); INSN_UID (insn) = CODE_LABEL_NUMBER (insn);
else else
INSN_UID (insn) = 0; {
if (NOTE_P (insn))
set_block_for_insn (insn, NULL);
INSN_UID (insn) = 0;
}
} }
} }
...@@ -4423,7 +4427,6 @@ rest_of_clean_state (void) ...@@ -4423,7 +4427,6 @@ rest_of_clean_state (void)
&& NOTE_KIND (insn) != NOTE_INSN_BLOCK_END && NOTE_KIND (insn) != NOTE_INSN_BLOCK_END
&& NOTE_KIND (insn) != NOTE_INSN_CFA_RESTORE_STATE))) && NOTE_KIND (insn) != NOTE_INSN_CFA_RESTORE_STATE)))
print_rtl_single (final_output, insn); print_rtl_single (final_output, insn);
} }
if (final_output) if (final_output)
......
...@@ -1900,8 +1900,33 @@ get_ebb_head_tail (basic_block beg, basic_block end, rtx *headp, rtx *tailp) ...@@ -1900,8 +1900,33 @@ get_ebb_head_tail (basic_block beg, basic_block end, rtx *headp, rtx *tailp)
beg_head = NEXT_INSN (beg_head); beg_head = NEXT_INSN (beg_head);
while (beg_head != beg_tail) while (beg_head != beg_tail)
if (NOTE_P (beg_head) || BOUNDARY_DEBUG_INSN_P (beg_head)) if (NOTE_P (beg_head))
beg_head = NEXT_INSN (beg_head); beg_head = NEXT_INSN (beg_head);
else if (DEBUG_INSN_P (beg_head))
{
rtx note, next;
for (note = NEXT_INSN (beg_head);
note != beg_tail;
note = next)
{
next = NEXT_INSN (note);
if (NOTE_P (note))
{
if (sched_verbose >= 9)
fprintf (sched_dump, "reorder %i\n", INSN_UID (note));
reorder_insns_nobb (note, note, PREV_INSN (beg_head));
if (BLOCK_FOR_INSN (note) != beg)
df_insn_change_bb (note, beg);
}
else if (!DEBUG_INSN_P (note))
break;
}
break;
}
else else
break; break;
...@@ -1913,8 +1938,36 @@ get_ebb_head_tail (basic_block beg, basic_block end, rtx *headp, rtx *tailp) ...@@ -1913,8 +1938,36 @@ get_ebb_head_tail (basic_block beg, basic_block end, rtx *headp, rtx *tailp)
end_head = NEXT_INSN (end_head); end_head = NEXT_INSN (end_head);
while (end_head != end_tail) while (end_head != end_tail)
if (NOTE_P (end_tail) || BOUNDARY_DEBUG_INSN_P (end_tail)) if (NOTE_P (end_tail))
end_tail = PREV_INSN (end_tail); end_tail = PREV_INSN (end_tail);
else if (DEBUG_INSN_P (end_tail))
{
rtx note, prev;
for (note = PREV_INSN (end_tail);
note != end_head;
note = prev)
{
prev = PREV_INSN (note);
if (NOTE_P (note))
{
if (sched_verbose >= 9)
fprintf (sched_dump, "reorder %i\n", INSN_UID (note));
reorder_insns_nobb (note, note, end_tail);
if (end_tail == BB_END (end))
BB_END (end) = note;
if (BLOCK_FOR_INSN (note) != end)
df_insn_change_bb (note, end);
}
else if (!DEBUG_INSN_P (note))
break;
}
break;
}
else else
break; break;
...@@ -1928,8 +1981,7 @@ no_real_insns_p (const_rtx head, const_rtx tail) ...@@ -1928,8 +1981,7 @@ no_real_insns_p (const_rtx head, const_rtx tail)
{ {
while (head != NEXT_INSN (tail)) while (head != NEXT_INSN (tail))
{ {
if (!NOTE_P (head) && !LABEL_P (head) if (!NOTE_P (head) && !LABEL_P (head))
&& !BOUNDARY_DEBUG_INSN_P (head))
return 0; return 0;
head = NEXT_INSN (head); head = NEXT_INSN (head);
} }
...@@ -2812,7 +2864,7 @@ schedule_block (basic_block *target_bb) ...@@ -2812,7 +2864,7 @@ schedule_block (basic_block *target_bb)
last_scheduled_insn = prev_head; last_scheduled_insn = prev_head;
gcc_assert ((NOTE_P (last_scheduled_insn) gcc_assert ((NOTE_P (last_scheduled_insn)
|| BOUNDARY_DEBUG_INSN_P (last_scheduled_insn)) || DEBUG_INSN_P (last_scheduled_insn))
&& BLOCK_FOR_INSN (last_scheduled_insn) == *target_bb); && BLOCK_FOR_INSN (last_scheduled_insn) == *target_bb);
/* Initialize INSN_QUEUE. Q_SIZE is the total number of insns in the /* Initialize INSN_QUEUE. Q_SIZE is the total number of insns in the
...@@ -3319,7 +3371,7 @@ set_priorities (rtx head, rtx tail) ...@@ -3319,7 +3371,7 @@ set_priorities (rtx head, rtx tail)
current_sched_info->sched_max_insns_priority; current_sched_info->sched_max_insns_priority;
rtx prev_head; rtx prev_head;
if (head == tail && (! INSN_P (head) || BOUNDARY_DEBUG_INSN_P (head))) if (head == tail && ! INSN_P (head))
gcc_unreachable (); gcc_unreachable ();
n_insn = 0; n_insn = 0;
......
...@@ -715,9 +715,6 @@ sd_init_insn (rtx insn) ...@@ -715,9 +715,6 @@ sd_init_insn (rtx insn)
INSN_FORW_DEPS (insn) = create_deps_list (); INSN_FORW_DEPS (insn) = create_deps_list ();
INSN_RESOLVED_FORW_DEPS (insn) = create_deps_list (); INSN_RESOLVED_FORW_DEPS (insn) = create_deps_list ();
if (DEBUG_INSN_P (insn))
DEBUG_INSN_SCHED_P (insn) = TRUE;
/* ??? It would be nice to allocate dependency caches here. */ /* ??? It would be nice to allocate dependency caches here. */
} }
...@@ -727,12 +724,6 @@ sd_finish_insn (rtx insn) ...@@ -727,12 +724,6 @@ sd_finish_insn (rtx insn)
{ {
/* ??? It would be nice to deallocate dependency caches here. */ /* ??? It would be nice to deallocate dependency caches here. */
if (DEBUG_INSN_P (insn))
{
gcc_assert (DEBUG_INSN_SCHED_P (insn));
DEBUG_INSN_SCHED_P (insn) = FALSE;
}
free_deps_list (INSN_HARD_BACK_DEPS (insn)); free_deps_list (INSN_HARD_BACK_DEPS (insn));
INSN_HARD_BACK_DEPS (insn) = NULL; INSN_HARD_BACK_DEPS (insn) = NULL;
......
...@@ -598,9 +598,9 @@ schedule_ebbs (void) ...@@ -598,9 +598,9 @@ schedule_ebbs (void)
a note or two. */ a note or two. */
while (head != tail) while (head != tail)
{ {
if (NOTE_P (head) || BOUNDARY_DEBUG_INSN_P (head)) if (NOTE_P (head) || DEBUG_INSN_P (head))
head = NEXT_INSN (head); head = NEXT_INSN (head);
else if (NOTE_P (tail) || BOUNDARY_DEBUG_INSN_P (tail)) else if (NOTE_P (tail) || DEBUG_INSN_P (tail))
tail = PREV_INSN (tail); tail = PREV_INSN (tail);
else if (LABEL_P (head)) else if (LABEL_P (head))
head = NEXT_INSN (head); head = NEXT_INSN (head);
......
...@@ -887,23 +887,6 @@ extern VEC(haifa_deps_insn_data_def, heap) *h_d_i_d; ...@@ -887,23 +887,6 @@ extern VEC(haifa_deps_insn_data_def, heap) *h_d_i_d;
#define IS_SPECULATION_BRANCHY_CHECK_P(INSN) \ #define IS_SPECULATION_BRANCHY_CHECK_P(INSN) \
(RECOVERY_BLOCK (INSN) != NULL && RECOVERY_BLOCK (INSN) != EXIT_BLOCK_PTR) (RECOVERY_BLOCK (INSN) != NULL && RECOVERY_BLOCK (INSN) != EXIT_BLOCK_PTR)
/* The unchanging bit tracks whether a debug insn is to be handled
like an insn (i.e., schedule it) or like a note (e.g., it is next
to a basic block boundary. */
#define DEBUG_INSN_SCHED_P(insn) \
(RTL_FLAG_CHECK1("DEBUG_INSN_SCHED_P", (insn), DEBUG_INSN)->unchanging)
/* True if INSN is a debug insn that is next to a basic block
boundary, i.e., it is to be handled by the scheduler like a
note. */
#define BOUNDARY_DEBUG_INSN_P(insn) \
(DEBUG_INSN_P (insn) && !DEBUG_INSN_SCHED_P (insn))
/* True if INSN is a debug insn that is not next to a basic block
boundary, i.e., it is to be handled by the scheduler like an
insn. */
#define SCHEDULE_DEBUG_INSN_P(insn) \
(DEBUG_INSN_P (insn) && DEBUG_INSN_SCHED_P (insn))
/* Dep status (aka ds_t) of the link encapsulates information, that is needed /* Dep status (aka ds_t) of the link encapsulates information, that is needed
for speculative scheduling. Namely, it is 4 integers in the range for speculative scheduling. Namely, it is 4 integers in the range
[0, MAX_DEP_WEAK] and 3 bits. [0, MAX_DEP_WEAK] and 3 bits.
......
...@@ -2138,7 +2138,7 @@ init_ready_list (void) ...@@ -2138,7 +2138,7 @@ init_ready_list (void)
src_head = head; src_head = head;
for (insn = src_head; insn != src_next_tail; insn = NEXT_INSN (insn)) for (insn = src_head; insn != src_next_tail; insn = NEXT_INSN (insn))
if (INSN_P (insn) && !BOUNDARY_DEBUG_INSN_P (insn)) if (INSN_P (insn))
try_ready (insn); try_ready (insn);
} }
} }
......
2011-02-02 Alexandre Oliva <aoliva@redhat.com>
PR debug/47498
PR debug/47501
PR debug/45136
PR debug/45130
* debug/pr47498.c: New.
* debug/pr47501.c: New.
2011-02-01 Richard Guenther <rguenther@suse.de> 2011-02-01 Richard Guenther <rguenther@suse.de>
PR tree-optimization/47559 PR tree-optimization/47559
......
/* { dg-do compile } */
/* { dg-options "-O2 -fsched2-use-superblocks -fcompare-debug" } */
int bar(void *);
void foo (void *p)
{
int i = 1;
while (i)
i = bar (p);
}
/* { dg-do compile } */
/* { dg-options "-Os -fmodulo-sched -fcompare-debug" } */
void
foo (void)
{
unsigned numlen;
unsigned foldlen;
for (; foldlen; foldlen -= numlen)
foo ();
}
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