+2001-12-27 Richard Henderson <rth@redhat.com>
+
+ * haifa-sched.c (reemit_other_notes): New.
+ (schedule_block): Use it.
+ * sched-ebb.c (schedule_ebbs): Call remove_unnecessary_notes.
+ * sched-rgn.c (schedule_insns): Likewise.
+ * cfglayout.c (remove_scope_notes): Handle removing note at
+ the end of the insn chain.
+ * function.c (debug_find_var_in_block_tree): New.
+
2001-12-27 Alan Modra <amodra@bigpond.net.au>
David Edelsohn <edelsohn@gnu.org>
static tree blocks_nreverse PARAMS ((tree));
static int all_blocks PARAMS ((tree, tree *));
static tree *get_block_vector PARAMS ((tree, int *));
+extern tree debug_find_var_in_block_tree PARAMS ((tree, tree));
/* We always define `record_insns' even if its not used so that we
can always export `prologue_epilogue_contains'. */
static void record_insns PARAMS ((rtx, varray_type *)) ATTRIBUTE_UNUSED;
return;
}
+
+/* If VAR is present in a subblock of BLOCK, return the subblock. */
+
+tree
+debug_find_var_in_block_tree (var, block)
+ tree var;
+ tree block;
+{
+ tree t;
+
+ for (t = BLOCK_VARS (block); t; t = TREE_CHAIN (t))
+ if (t == var)
+ return block;
+
+ for (t = BLOCK_SUBBLOCKS (block); t; t = TREE_CHAIN (t))
+ {
+ tree ret = debug_find_var_in_block_tree (var, t);
+ if (ret)
+ return ret;
+ }
+
+ return NULL_TREE;
+}
\f
/* Allocate a function structure and reset its contents to the defaults. */
static rtx unlink_other_notes PARAMS ((rtx, rtx));
static rtx unlink_line_notes PARAMS ((rtx, rtx));
static rtx reemit_notes PARAMS ((rtx, rtx));
+static rtx reemit_other_notes PARAMS ((rtx, rtx));
static rtx *ready_lastpos PARAMS ((struct ready_list *));
static void ready_sort PARAMS ((struct ready_list *));
return retval;
}
+
+/* NOTE_LIST is the end of a chain of notes previously found among the
+ insns. Insert them at the beginning of the insns. Actually, insert
+ NOTE_INSN_BLOCK_END notes at the end of the insns. Doing otherwise
+ tends to collapse lexical blocks into empty regions, which is somewhat
+ less than useful. */
+/* ??? Ideally we'd mark each insn with the block it originated from,
+ and preserve that information. This requires some moderately
+ sophisticated block reconstruction code, since block nestings must
+ be preserved. */
+
+static rtx
+reemit_other_notes (head, tail)
+ rtx head, tail;
+{
+ bool saw_block_beg = false;
+
+ while (note_list)
+ {
+ rtx note_tail = note_list;
+ note_list = PREV_INSN (note_tail);
+
+ if (NOTE_LINE_NUMBER (note_tail) == NOTE_INSN_BLOCK_END
+ /* We can only extend the lexical block while we havn't
+ seen a BLOCK_BEG note. Otherwise we risk mis-nesting
+ the notes. */
+ && ! saw_block_beg)
+ {
+ rtx insert_after = tail;
+ if (GET_CODE (NEXT_INSN (tail)) == BARRIER)
+ insert_after = NEXT_INSN (tail);
+
+ PREV_INSN (note_tail) = insert_after;
+ NEXT_INSN (note_tail) = NEXT_INSN (insert_after);
+ if (NEXT_INSN (insert_after))
+ PREV_INSN (NEXT_INSN (insert_after)) = note_tail;
+ NEXT_INSN (insert_after) = note_tail;
+ }
+ else
+ {
+ if (NOTE_LINE_NUMBER (note_tail) == NOTE_INSN_BLOCK_BEG)
+ saw_block_beg = true;
+
+ PREV_INSN (note_tail) = PREV_INSN (head);
+ NEXT_INSN (PREV_INSN (head)) = note_tail;
+ NEXT_INSN (note_tail) = head;
+ PREV_INSN (head) = note_tail;
+ head = note_tail;
+ }
+ }
+
+ return head;
+}
+
/* Move INSN, and all insns which should be issued before it,
due to SCHED_GROUP_P flag. Reemit notes if needed.
head = NEXT_INSN (prev_head);
tail = last;
- /* Restore-other-notes: NOTE_LIST is the end of a chain of notes
- previously found among the insns. Insert them at the beginning
- of the insns. */
- if (note_list != 0)
- {
- rtx note_head = note_list;
-
- while (PREV_INSN (note_head))
- {
- note_head = PREV_INSN (note_head);
- }
-
- PREV_INSN (note_head) = PREV_INSN (head);
- NEXT_INSN (PREV_INSN (head)) = note_head;
- PREV_INSN (head) = note_list;
- NEXT_INSN (note_list) = head;
- head = note_head;
- }
+ head = reemit_other_notes (head, tail);
/* Debugging. */
if (sched_verbose)