diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-12-27 22:19:59 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-12-27 22:19:59 +0000 |
commit | baa8dec7fd2c771ddce19df5bc222614e0d02351 (patch) | |
tree | a7f9af2b63f2968b5377756f9c3886f53c2600dd /gcc/haifa-sched.c | |
parent | 5edc4f6599d0b5f0379bed87722f90cd9f94da53 (diff) | |
download | gcc-baa8dec7fd2c771ddce19df5bc222614e0d02351.tar.gz |
* 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.
* gcc.dg/debug-1.c, gcc.dg/debug-2.c: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@48333 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/haifa-sched.c')
-rw-r--r-- | gcc/haifa-sched.c | 74 |
1 files changed, 56 insertions, 18 deletions
diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c index 7b9a2e82126..ca6cfbb1d4f 100644 --- a/gcc/haifa-sched.c +++ b/gcc/haifa-sched.c @@ -319,6 +319,7 @@ static void adjust_priority PARAMS ((rtx)); 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 *)); @@ -1575,6 +1576,60 @@ reemit_notes (insn, last) 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. @@ -1800,24 +1855,7 @@ schedule_block (b, rgn_n_insns) 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) |