diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-03-13 06:10:23 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-03-13 06:10:23 +0000 |
commit | 5c0913b4c7b4d6796981d57a717036531d114874 (patch) | |
tree | a1e4931ef78ae5e20fe5c661e7f9e42a98de6573 /gcc/function.c | |
parent | df9f5cf876500e0d1acc2c339c908073efd020a2 (diff) | |
download | gcc-5c0913b4c7b4d6796981d57a717036531d114874.tar.gz |
PR optimization/5901
* function.c (reposition_prologue_and_epilogue_notes): Position
the markers after/before the last/first insn not deleted.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@50715 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/function.c')
-rw-r--r-- | gcc/function.c | 92 |
1 files changed, 48 insertions, 44 deletions
diff --git a/gcc/function.c b/gcc/function.c index f245a063a51..b451eefcc89 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -7782,86 +7782,90 @@ reposition_prologue_and_epilogue_notes (f) rtx f ATTRIBUTE_UNUSED; { #if defined (HAVE_prologue) || defined (HAVE_epilogue) + rtx insn, last, note; int len; if ((len = VARRAY_SIZE (prologue)) > 0) { - rtx insn, note = 0; + last = 0, note = 0; /* Scan from the beginning until we reach the last prologue insn. We apparently can't depend on basic_block_{head,end} after reorg has run. */ - for (insn = f; len && insn; insn = NEXT_INSN (insn)) + for (insn = f; insn; insn = NEXT_INSN (insn)) { if (GET_CODE (insn) == NOTE) { if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_PROLOGUE_END) note = insn; } - else if ((len -= contains (insn, prologue)) == 0) + else if (contains (insn, prologue)) { - rtx next; - /* Find the prologue-end note if we haven't already, and - move it to just after the last prologue insn. */ - if (note == 0) - { - for (note = insn; (note = NEXT_INSN (note));) - if (GET_CODE (note) == NOTE - && NOTE_LINE_NUMBER (note) == NOTE_INSN_PROLOGUE_END) - break; - } + last = insn; + if (--len == 0) + break; + } + } + + if (last) + { + rtx next; - next = NEXT_INSN (note); + /* Find the prologue-end note if we haven't already, and + move it to just after the last prologue insn. */ + if (note == 0) + { + for (note = last; (note = NEXT_INSN (note));) + if (GET_CODE (note) == NOTE + && NOTE_LINE_NUMBER (note) == NOTE_INSN_PROLOGUE_END) + break; + } - /* Whether or not we can depend on BLOCK_HEAD, - attempt to keep it up-to-date. */ - if (BLOCK_HEAD (0) == note) - BLOCK_HEAD (0) = next; + next = NEXT_INSN (note); - remove_insn (note); - /* Avoid placing note between CODE_LABEL and BASIC_BLOCK note. */ - if (GET_CODE (insn) == CODE_LABEL) - insn = NEXT_INSN (insn); - add_insn_after (note, insn); - } + /* Avoid placing note between CODE_LABEL and BASIC_BLOCK note. */ + if (GET_CODE (last) == CODE_LABEL) + last = NEXT_INSN (last); + reorder_insns (note, note, last); } } if ((len = VARRAY_SIZE (epilogue)) > 0) { - rtx insn, note = 0; + last = 0, note = 0; /* Scan from the end until we reach the first epilogue insn. We apparently can't depend on basic_block_{head,end} after reorg has run. */ - for (insn = get_last_insn (); len && insn; insn = PREV_INSN (insn)) + for (insn = get_last_insn (); insn; insn = PREV_INSN (insn)) { if (GET_CODE (insn) == NOTE) { if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_EPILOGUE_BEG) note = insn; } - else if ((len -= contains (insn, epilogue)) == 0) + else if (contains (insn, epilogue)) { - /* Find the epilogue-begin note if we haven't already, and - move it to just before the first epilogue insn. */ - if (note == 0) - { - for (note = insn; (note = PREV_INSN (note));) - if (GET_CODE (note) == NOTE - && NOTE_LINE_NUMBER (note) == NOTE_INSN_EPILOGUE_BEG) - break; - } - - /* Whether or not we can depend on BLOCK_HEAD, - attempt to keep it up-to-date. */ - if (n_basic_blocks - && BLOCK_HEAD (n_basic_blocks-1) == insn) - BLOCK_HEAD (n_basic_blocks-1) = note; + last = insn; + if (--len == 0) + break; + } + } - remove_insn (note); - add_insn_before (note, insn); + if (last) + { + /* Find the epilogue-begin note if we haven't already, and + move it to just before the first epilogue insn. */ + if (note == 0) + { + for (note = insn; (note = PREV_INSN (note));) + if (GET_CODE (note) == NOTE + && NOTE_LINE_NUMBER (note) == NOTE_INSN_EPILOGUE_BEG) + break; } + + if (PREV_INSN (last) != note) + reorder_insns (note, note, PREV_INSN (last)); } } #endif /* HAVE_prologue or HAVE_epilogue */ |