Commit 9f53e965 by Richard Henderson Committed by Richard Henderson

re PR target/5901 ([IA64] misplaced .body)

        PR optimization/5901
        * function.c (reposition_prologue_and_epilogue_notes): Position
        the markers after/before the last/first insn not deleted.

From-SVN: r50715
parent 5b43fed1
2002-03-12 Richard Henderson <rth@redhat.com> 2002-03-12 Richard Henderson <rth@redhat.com>
PR optimization/5901
* function.c (reposition_prologue_and_epilogue_notes): Position
the markers after/before the last/first insn not deleted.
2002-03-12 Richard Henderson <rth@redhat.com>
PR optimization/5878
* config/arc/arc.h, config/cris/cris.h, config/i386/i386.h, * config/arc/arc.h, config/cris/cris.h, config/i386/i386.h,
config/m68k/m68k.h, config/s390/s390.h, config/sparc/sparc.h config/m68k/m68k.h, config/s390/s390.h, config/sparc/sparc.h
(PIC_OFFSET_TABLE_REGNUM): Conditionalize on flag_pic. (PIC_OFFSET_TABLE_REGNUM): Conditionalize on flag_pic.
......
...@@ -7782,86 +7782,90 @@ reposition_prologue_and_epilogue_notes (f) ...@@ -7782,86 +7782,90 @@ reposition_prologue_and_epilogue_notes (f)
rtx f ATTRIBUTE_UNUSED; rtx f ATTRIBUTE_UNUSED;
{ {
#if defined (HAVE_prologue) || defined (HAVE_epilogue) #if defined (HAVE_prologue) || defined (HAVE_epilogue)
rtx insn, last, note;
int len; int len;
if ((len = VARRAY_SIZE (prologue)) > 0) 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. /* Scan from the beginning until we reach the last prologue insn.
We apparently can't depend on basic_block_{head,end} after We apparently can't depend on basic_block_{head,end} after
reorg has run. */ 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 (GET_CODE (insn) == NOTE)
{ {
if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_PROLOGUE_END) if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_PROLOGUE_END)
note = insn; note = insn;
} }
else if ((len -= contains (insn, prologue)) == 0) else if (contains (insn, prologue))
{ {
rtx next; last = insn;
/* Find the prologue-end note if we haven't already, and if (--len == 0)
move it to just after the last prologue insn. */ break;
if (note == 0) }
{ }
for (note = insn; (note = NEXT_INSN (note));)
if (GET_CODE (note) == NOTE if (last)
&& NOTE_LINE_NUMBER (note) == NOTE_INSN_PROLOGUE_END) {
break; 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, next = NEXT_INSN (note);
attempt to keep it up-to-date. */
if (BLOCK_HEAD (0) == note)
BLOCK_HEAD (0) = next;
remove_insn (note); /* Avoid placing note between CODE_LABEL and BASIC_BLOCK note. */
/* Avoid placing note between CODE_LABEL and BASIC_BLOCK note. */ if (GET_CODE (last) == CODE_LABEL)
if (GET_CODE (insn) == CODE_LABEL) last = NEXT_INSN (last);
insn = NEXT_INSN (insn); reorder_insns (note, note, last);
add_insn_after (note, insn);
}
} }
} }
if ((len = VARRAY_SIZE (epilogue)) > 0) 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. /* Scan from the end until we reach the first epilogue insn.
We apparently can't depend on basic_block_{head,end} after We apparently can't depend on basic_block_{head,end} after
reorg has run. */ 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 (GET_CODE (insn) == NOTE)
{ {
if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_EPILOGUE_BEG) if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_EPILOGUE_BEG)
note = insn; 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 last = insn;
move it to just before the first epilogue insn. */ if (--len == 0)
if (note == 0) break;
{ }
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;
remove_insn (note); if (last)
add_insn_before (note, insn); {
/* 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 */ #endif /* HAVE_prologue or HAVE_epilogue */
......
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