+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.
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.
-
- 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. */
+ /* 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.
+
+ 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);
--- /dev/null
+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);
+ }
+}