+2011-01-31 Alexandre Oliva <aoliva@redhat.com>
+
+ Reverted:
+ 2011-01-25 Alexandre Oliva <aoliva@redhat.com>
+ 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): Don't skip 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-01-31 Alan Modra <amodra@gmail.com>
* config/rs6000/rs6000.c (print_operand): Rearrange addends in
if (LABEL_P (insn))
INSN_UID (insn) = CODE_LABEL_NUMBER (insn);
else
- {
- if (NOTE_P (insn))
- set_block_for_insn (insn, NULL);
- INSN_UID (insn) = 0;
- }
+ INSN_UID (insn) = 0;
}
}
&& NOTE_KIND (insn) != NOTE_INSN_BLOCK_END
&& NOTE_KIND (insn) != NOTE_INSN_CFA_RESTORE_STATE)))
print_rtl_single (final_output, insn);
+
}
if (final_output)
beg_head = NEXT_INSN (beg_head);
while (beg_head != beg_tail)
- if (NOTE_P (beg_head))
+ if (NOTE_P (beg_head) || BOUNDARY_DEBUG_INSN_P (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));
- }
- else if (!DEBUG_INSN_P (note))
- break;
- }
-
- break;
- }
else
break;
end_head = NEXT_INSN (end_head);
while (end_head != end_tail)
- if (NOTE_P (end_tail))
+ if (NOTE_P (end_tail) || BOUNDARY_DEBUG_INSN_P (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))
- df_insn_change_bb (note, NULL);
- }
- else if (!DEBUG_INSN_P (note))
- break;
- }
-
- break;
- }
else
break;
{
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;
head = NEXT_INSN (head);
}
last_scheduled_insn = prev_head;
gcc_assert ((NOTE_P (last_scheduled_insn)
- || DEBUG_INSN_P (last_scheduled_insn))
+ || BOUNDARY_DEBUG_INSN_P (last_scheduled_insn))
&& BLOCK_FOR_INSN (last_scheduled_insn) == *target_bb);
/* Initialize INSN_QUEUE. Q_SIZE is the total number of insns in the
current_sched_info->sched_max_insns_priority;
rtx prev_head;
- if (head == tail && ! INSN_P (head))
+ if (head == tail && (! INSN_P (head) || BOUNDARY_DEBUG_INSN_P (head)))
gcc_unreachable ();
n_insn = 0;
INSN_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 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));
INSN_HARD_BACK_DEPS (insn) = NULL;
a note or two. */
while (head != tail)
{
- if (NOTE_P (head))
+ if (NOTE_P (head) || BOUNDARY_DEBUG_INSN_P (head))
head = NEXT_INSN (head);
- else if (NOTE_P (tail))
+ else if (NOTE_P (tail) || BOUNDARY_DEBUG_INSN_P (tail))
tail = PREV_INSN (tail);
else if (LABEL_P (head))
head = NEXT_INSN (head);
#define IS_SPECULATION_BRANCHY_CHECK_P(INSN) \
(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
for speculative scheduling. Namely, it is 4 integers in the range
[0, MAX_DEP_WEAK] and 3 bits.
src_head = head;
for (insn = src_head; insn != src_next_tail; insn = NEXT_INSN (insn))
- if (INSN_P (insn))
+ if (INSN_P (insn) && !BOUNDARY_DEBUG_INSN_P (insn))
try_ready (insn);
}
}