haifa-sched.c (schedule_block): Explain the real reason we delete REG_SAVE_NOTEs on the first insn of a block.

* haifa-sched.c (schedule_block): Explain the real reason
we delete REG_SAVE_NOTEs on the first insn of a block.
Don't delete REG_SAVE_NOTES for NOTE_INSN_SETJMP.

* compile/20000224-1.c: New test.

From-SVN: r32150
This commit is contained in:
Geoff Keating 2000-02-25 18:17:40 +00:00 committed by Geoffrey Keating
parent 66830bb21b
commit 0e2eaba46d
4 changed files with 69 additions and 9 deletions

View File

@ -1,3 +1,9 @@
2000-02-25 Geoff Keating <geoffk@cygnus.com>
* haifa-sched.c (schedule_block): Explain the real reason
we delete REG_SAVE_NOTEs on the first insn of a block.
Don't delete REG_SAVE_NOTES for NOTE_INSN_SETJMP.
2000-02-24 Mark Mitchell <mark@codesourcery.com>
* input.h (push_srcloc): New function.

View File

@ -5744,22 +5744,31 @@ schedule_block (bb, rgn_n_insns)
had different notions of what the "head" insn was. */
get_bb_head_tail (bb, &head, &tail);
/* Interblock scheduling could have moved the original head insn from this
block into a proceeding block. This may also cause schedule_block and
compute_forward_dependences to have different notions of what the
"head" insn was.
/* rm_other_notes only removes notes which are _inside_ the
block---that is, it won't remove notes before the first real insn
or after the last real insn of the block. So if the first insn
has a REG_SAVE_NOTE which would otherwise be emitted before the
insn, it is redundant with the note before the start of the
block, and so we have to take it out.
If the interblock movement happened to make this block start with
some notes (LOOP, EH or SETJMP) before the first real insn, then
HEAD will have various special notes attached to it which must be
removed so that we don't end up with extra copies of the notes. */
FIXME: Probably the same thing should be done with REG_SAVE_NOTEs
referencing NOTE_INSN_SETJMP at the end of the block. */
if (GET_RTX_CLASS (GET_CODE (head)) == 'i')
{
rtx note;
for (note = REG_NOTES (head); note; note = XEXP (note, 1))
if (REG_NOTE_KIND (note) == REG_SAVE_NOTE)
remove_note (head, note);
{
if (INTVAL (XEXP (note, 0)) != NOTE_INSN_SETJMP)
{
remove_note (head, note);
note = XEXP (note, 1);
remove_note (head, note);
}
else
note = XEXP (note, 1);
}
}
next_tail = NEXT_INSN (tail);

View File

@ -1,3 +1,7 @@
2000-02-25 Geoff Keating <geoffk@cygnus.com>
* compile/20000224-1.c: New test.
2000-02-25 Alexandre Oliva <oliva@lsd.ic.unicamp.br>
* compile/cpp-2.c: New test.

View File

@ -0,0 +1,41 @@
enum Lisp_Type
{
Lisp_Int
,Lisp_Record
,Lisp_Cons
,Lisp_String
,Lisp_Vector
,Lisp_Symbol
,Lisp_Char
};
typedef
union Lisp_Object
{
struct
{
enum Lisp_Type type: 3L ;
unsigned long markbit: 1;
unsigned long val: 60;
} gu;
long i;
}
Lisp_Object;
extern int initialized;
void
init_device_faces (int *d)
{
if (initialized)
{
Lisp_Object tdevice;
do {
tdevice = (union Lisp_Object)
{ gu:
{ markbit: 0,
type: Lisp_Record,
val: ((unsigned long )d)
}
};
} while (0);
call_critical_lisp_code (tdevice);
}
}