OSDN Git Service

* config/alpha/alpha.c (alpha_emit_floatuns): Ensure we pass a REG
[pf3gnuchains/gcc-fork.git] / gcc / rtl.h
index be81beb..c22727e 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1,5 +1,6 @@
 /* Register Transfer Language (RTL) definitions for GNU C-Compiler
-   Copyright (C) 1987, 91-98, 1999 Free Software Foundation, Inc.
+   Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+   1999, 2000 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -86,11 +87,13 @@ typedef union rtunion_def
 {
   HOST_WIDE_INT rtwint;
   int rtint;
-  char *rtstr;
+  unsigned int rtuint;
+  const char *rtstr;
   struct rtx_def *rtx;
   struct rtvec_def *rtvec;
   enum machine_mode rttype;
   addr_diff_vec_flags rt_addr_diff_vec_flags;
+  struct cselib_val_struct *rt_cselib;
   struct bitmap_head_def *rtbit;
   union tree_node *rttree;
   struct basic_block_def *bb;
@@ -102,23 +105,27 @@ typedef struct rtx_def
 {
 #ifdef ONLY_INT_FIELDS
 #ifdef CODE_FIELD_BUG
-  unsigned int code : 15;
+  unsigned int code : 16;
 #else
   unsigned short code;
 #endif
 #else
   /* The kind of expression this is.  */
-  enum rtx_code code : 15;
+  enum rtx_code code : 16;
 #endif
+
   /* The kind of value the expression has.  */
 #ifdef ONLY_INT_FIELDS
   int mode : 8;
 #else
   enum machine_mode mode : 8;
 #endif
-  /* LINK_COST_ZERO in an INSN_LIST.  */
+  /* 1 in an INSN if it can alter flow of control
+     within this function.
+     LINK_COST_ZERO in an INSN_LIST.  */
   unsigned int jump : 1;
-  /* LINK_COST_FREE in an INSN_LIST.  */
+  /* 1 in an INSN if it can call another function.
+     LINK_COST_FREE in an INSN_LIST.  */
   unsigned int call : 1;
   /* 1 in a MEM or REG if value of this expression will never change
      during the current function, even though it is not
@@ -142,7 +149,7 @@ typedef struct rtx_def
      0 if the MEM was a variable or the result of a * operator in C;
      1 if it was the result of a . or -> operator (on a struct) in C.
      1 in a REG if the register is used only in exit code a loop.
-     1 in a SUBREG expression if was generated from a variable with a 
+     1 in a SUBREG expression if was generated from a variable with a
      promoted mode.
      1 in a CODE_LABEL if the label is used for nonlocal gotos
      and must not be deleted even if its count is zero.
@@ -156,7 +163,7 @@ typedef struct rtx_def
   unsigned int in_struct : 1;
   /* 1 if this rtx is used.  This is used for copying shared structure.
      See `unshare_all_rtl'.
-     In a REG, this is not needed for that purpose, and used instead 
+     In a REG, this is not needed for that purpose, and used instead
      in `leaf_renumber_regs_insn'.
      In a SYMBOL_REF, means that emit_library_call
      has used it as the function.  */
@@ -167,14 +174,11 @@ typedef struct rtx_def
   unsigned integrated : 1;
   /* 1 in an INSN or a SET if this rtx is related to the call frame,
      either changing how we compute the frame address or saving and
-     restoring registers in the prologue and epilogue.  
+     restoring registers in the prologue and epilogue.
      1 in a MEM if the MEM refers to a scalar, rather than a member of
      an aggregate.  */
   unsigned frame_related : 1;
 
-  /* Used by the garbage collector.  */
-  unsigned gc_mark : 1;
-
   /* The first element of the operands of this rtx.
      The number of operands and their types are controlled
      by the `code' field, according to rtl.def.  */
@@ -206,7 +210,6 @@ typedef struct rtx_def
 
 typedef struct rtvec_def{
   int num_elem;                /* number of elements */
-  int gc_mark;
   struct rtx_def *elem[1];
 } *rtvec;
 
@@ -229,7 +232,7 @@ typedef struct rtvec_def{
 
 /* General accessor macros for accessing the fields of an rtx.  */
 
-#if defined ENABLE_CHECKING  && (__GNUC__ > 2 || __GNUC_MINOR__ > 6)
+#if defined ENABLE_RTL_CHECKING && (GCC_VERSION >= 2007)
 /* The bit with a star outside the statement expr and an & inside is
    so that N can be evaluated only once.  */
 #define RTL_CHECK1(RTX, N, C1)                                         \
@@ -277,26 +280,26 @@ typedef struct rtvec_def{
                                  __PRETTY_FUNCTION__);                 \
      &_rtvec->elem[_i]; }))
 
-extern void rtl_check_failed_bounds PROTO((rtx, int,
+extern void rtl_check_failed_bounds PARAMS ((rtx, int,
                                           const char *, int, const char *))
     ATTRIBUTE_NORETURN;
-extern void rtl_check_failed_type1 PROTO((rtx, int, int,
+extern void rtl_check_failed_type1 PARAMS ((rtx, int, int,
                                          const char *, int, const char *))
     ATTRIBUTE_NORETURN;
-extern void rtl_check_failed_type2 PROTO((rtx, int, int, int,
+extern void rtl_check_failed_type2 PARAMS ((rtx, int, int, int,
                                          const char *, int, const char *))
     ATTRIBUTE_NORETURN;
-extern void rtl_check_failed_code1 PROTO((rtx, enum rtx_code,
+extern void rtl_check_failed_code1 PARAMS ((rtx, enum rtx_code,
                                          const char *, int, const char *))
     ATTRIBUTE_NORETURN;
-extern void rtl_check_failed_code2 PROTO((rtx, enum rtx_code, enum rtx_code,
+extern void rtl_check_failed_code2 PARAMS ((rtx, enum rtx_code, enum rtx_code,
                                          const char *, int, const char *))
     ATTRIBUTE_NORETURN;
-extern void rtvec_check_failed_bounds PROTO((rtvec, int,
+extern void rtvec_check_failed_bounds PARAMS ((rtvec, int,
                                             const char *, int, const char *))
     ATTRIBUTE_NORETURN;
 
-#else   /* not ENABLE_CHECKING */
+#else   /* not ENABLE_RTL_CHECKING */
 
 #define RTL_CHECK1(RTX, N, C1)      ((RTX)->fld[N])
 #define RTL_CHECK2(RTX, N, C1, C2)  ((RTX)->fld[N])
@@ -332,9 +335,11 @@ extern void rtvec_check_failed_bounds PROTO((rtvec, int,
 #define X0TREE(RTX, N)    (RTL_CHECK1(RTX, N, '0').rttree)
 #define X0BBDEF(RTX, N)           (RTL_CHECK1(RTX, N, '0').bb)
 #define X0ADVFLAGS(RTX, N) (RTL_CHECK1(RTX, N, '0').rt_addr_diff_vec_flags)
+#define X0CSELIB(RTX, N)   (RTL_CHECK1(RTX, N, '0').rt_cselib)
 
 #define XCWINT(RTX, N, C)     (RTL_CHECKC1(RTX, N, C).rtwint)
 #define XCINT(RTX, N, C)      (RTL_CHECKC1(RTX, N, C).rtint)
+#define XCUINT(RTX, N, C)     (RTL_CHECKC1(RTX, N, C).rtuint)
 #define XCSTR(RTX, N, C)      (RTL_CHECKC1(RTX, N, C).rtstr)
 #define XCEXP(RTX, N, C)      (RTL_CHECKC1(RTX, N, C).rtx)
 #define XCVEC(RTX, N, C)      (RTL_CHECKC1(RTX, N, C).rtvec)
@@ -343,6 +348,7 @@ extern void rtvec_check_failed_bounds PROTO((rtvec, int,
 #define XCTREE(RTX, N, C)     (RTL_CHECKC1(RTX, N, C).rttree)
 #define XCBBDEF(RTX, N, C)    (RTL_CHECKC1(RTX, N, C).bb)
 #define XCADVFLAGS(RTX, N, C) (RTL_CHECKC1(RTX, N, C).rt_addr_diff_vec_flags)
+#define XCCSELIB(RTX, N, C)   (RTL_CHECKC1(RTX, N, C).rt_cselib)
 
 #define XCVECEXP(RTX, N, M, C) RTVEC_ELT (XCVEC (RTX, N, C), M)
 #define XCVECLEN(RTX, N, C)    GET_NUM_ELEM (XCVEC (RTX, N, C))
@@ -351,6 +357,9 @@ extern void rtvec_check_failed_bounds PROTO((rtvec, int,
 \f
 /* ACCESS MACROS for particular fields of insns.  */
 
+/* Determines whether X is an insn.  */
+#define INSN_P(X)       (GET_RTX_CLASS (GET_CODE(X)) == 'i')
+
 /* Holds a unique number for each insn.
    These are not necessarily sequentially increasing.  */
 #define INSN_UID(INSN)  XINT(INSN, 0)
@@ -379,6 +388,9 @@ extern void rtvec_check_failed_bounds PROTO((rtvec, int,
 /* 1 if insn is a call to a const function.  */
 #define CONST_CALL_P(INSN) ((INSN)->unchanging)
 
+/* 1 if insn (assumed to be a CALL_INSN) is a sibling call.  */
+#define SIBLING_CALL_P(INSN) ((INSN)->jump)
+
 /* 1 if insn is a branch that should not unconditionally execute its
    delay slots, i.e., it is an annulled branch.   */
 #define INSN_ANNULLED_BRANCH_P(INSN) ((INSN)->unchanging)
@@ -389,98 +401,141 @@ extern void rtvec_check_failed_bounds PROTO((rtvec, int,
    clear, the insn should be executed only if the branch is not taken.  */
 #define INSN_FROM_TARGET_P(INSN) ((INSN)->in_struct)
 
+#define ADDR_DIFF_VEC_FLAGS(RTX) X0ADVFLAGS(RTX, 4)
+
+#define CSELIB_VAL_PTR(RTX) X0CSELIB(RTX, 0)
+
 /* Holds a list of notes on what this insn does to various REGs.
-   It is a chain of EXPR_LIST rtx's, where the second operand
-   is the chain pointer and the first operand is the REG being described.
+   It is a chain of EXPR_LIST rtx's, where the second operand is the
+   chain pointer and the first operand is the REG being described.
    The mode field of the EXPR_LIST contains not a real machine mode
-   but a value that says what this note says about the REG:
-     REG_DEAD means that the value in REG dies in this insn (i.e., it is
-   not needed past this insn).  If REG is set in this insn, the REG_DEAD
-   note may, but need not, be omitted.
-     REG_INC means that the REG is autoincremented or autodecremented.
-     REG_EQUIV describes the insn as a whole; it says that the insn
-   sets a register to a constant value or to be equivalent to a memory
-   address.  If the register is spilled to the stack then the constant
-   value should be substituted for it.  The contents of the REG_EQUIV
-   is the constant value or memory address, which may be different
-   from the source of the SET although it has the same value.  A
-   REG_EQUIV note may also appear on an insn which copies a register
-   parameter to a pseudo-register, if there is a memory address which
-   could be used to hold that pseudo-register throughout the function.
-     REG_EQUAL is like REG_EQUIV except that the destination
-   is only momentarily equal to the specified rtx.  Therefore, it
-   cannot be used for substitution; but it can be used for cse.
-     REG_RETVAL means that this insn copies the return-value of
-   a library call out of the hard reg for return values.  This note
-   is actually an INSN_LIST and it points to the first insn involved
-   in setting up arguments for the call.  flow.c uses this to delete
-   the entire library call when its result is dead.
-     REG_LIBCALL is the inverse of REG_RETVAL: it goes on the first insn
-   of the library call and points at the one that has the REG_RETVAL.
-     REG_WAS_0 says that the register set in this insn held 0 before the insn.
-   The contents of the note is the insn that stored the 0.
-   If that insn is deleted or patched to a NOTE, the REG_WAS_0 is inoperative.
-   The REG_WAS_0 note is actually an INSN_LIST, not an EXPR_LIST.
-     REG_NONNEG means that the register is always nonnegative during
-   the containing loop.  This is used in branches so that decrement and
-   branch instructions terminating on zero can be matched.  There must be
-   an insn pattern in the md file named `decrement_and_branch_until_zero'
-   or else this will never be added to any instructions.
-     REG_NO_CONFLICT means there is no conflict *after this insn*
-   between the register in the note and the destination of this insn.
-     REG_UNUSED identifies a register set in this insn and never used.
-     REG_CC_SETTER and REG_CC_USER link a pair of insns that set and use
-   CC0, respectively.  Normally, these are required to be consecutive insns,
-   but we permit putting a cc0-setting insn in the delay slot of a branch
-   as long as only one copy of the insn exists.  In that case, these notes
-   point from one to the other to allow code generation to determine what
-   any require information and to properly update CC_STATUS.
-     REG_LABEL points to a CODE_LABEL.  Used by non-JUMP_INSNs to
-   say that the CODE_LABEL contained in the REG_LABEL note is used
-   by the insn.
-     REG_DEP_ANTI is used in LOG_LINKS which represent anti (write after read)
-   dependencies.  REG_DEP_OUTPUT is used in LOG_LINKS which represent output
-   (write after write) dependencies.  Data dependencies, which are the only
-   type of LOG_LINK created by flow, are represented by a 0 reg note kind.  */
-/*   REG_BR_PROB is attached to JUMP_INSNs and CALL_INSNs when the flag
-   -fbranch-probabilities is given.  It has an integer value.  For jumps,
-   it is the probability that this is a taken branch.  For calls, it is the
-   probability that this call won't return.
-     REG_EXEC_COUNT is attached to the first insn of each basic block, and
-   the first insn after each CALL_INSN.  It indicates how many times this
-   block was executed.
-     REG_SAVE_AREA is used to optimize rtl generated by dynamic stack
-   allocations for targets where SETJMP_VIA_SAVE_AREA is true.
-     REG_BR_PRED is attached to JUMP_INSNs only, it holds the branch prediction
-   flags computed by get_jump_flags() after dbr scheduling is complete.
-     REG_FRAME_RELATED_EXPR is attached to insns that are RTX_FRAME_RELATED_P,
-   but are too complex for DWARF to interpret what they imply.  The attached
-   rtx is used instead of intuition.  */
-/*   REG_EH_REGION is used to indicate what exception region an INSN
-   belongs in.  This can be used to indicate what region a call may throw
-   to. a REGION of 0 indicates that a call cannot throw at all.
-   a REGION  of -1 indicates that it cannot throw, nor will it execute
-   a non-local goto.
-     REG_EH_RETHROW is used to indicate that a call is actually a
-   call to rethrow, and specifies the rethrow symbol for the region 
-   the rethrow is targetting.  This provides a way to generate the 
-   non standard flow edges required for a rethrow. */
-   
+   but a value from enum reg_note.  */
 
 #define REG_NOTES(INSN)        XEXP(INSN, 6)
 
-#define ADDR_DIFF_VEC_FLAGS(RTX) X0ADVFLAGS(RTX, 4)
-
 /* Don't forget to change reg_note_name in rtl.c.  */
-enum reg_note { REG_DEAD = 1, REG_INC = 2, REG_EQUIV = 3, REG_WAS_0 = 4,
-               REG_EQUAL = 5, REG_RETVAL = 6, REG_LIBCALL = 7,
-               REG_NONNEG = 8, REG_NO_CONFLICT = 9, REG_UNUSED = 10,
-               REG_CC_SETTER = 11, REG_CC_USER = 12, REG_LABEL = 13,
-               REG_DEP_ANTI = 14, REG_DEP_OUTPUT = 15, REG_BR_PROB = 16,
-               REG_EXEC_COUNT = 17, REG_NOALIAS = 18, REG_SAVE_AREA = 19,
-               REG_BR_PRED = 20, REG_EH_CONTEXT = 21,
-               REG_FRAME_RELATED_EXPR = 22, REG_EH_REGION = 23,
-               REG_EH_RETHROW = 24 };
+enum reg_note
+{
+  /* The value in REG dies in this insn (i.e., it is not needed past
+     this insn).  If REG is set in this insn, the REG_DEAD note may,
+     but need not, be omitted.  */
+  REG_DEAD = 1,
+
+  /* The REG is autoincremented or autodecremented.  */
+  REG_INC,
+
+  /* Describes the insn as a whole; it says that the insn sets a register
+     to a constant value or to be equivalent to a memory address.  If the
+     register is spilled to the stack then the constant value should be
+     substituted for it.  The contents of the REG_EQUIV is the constant
+     value or memory address, which may be different from the source of
+     the SET although it has the same value.  A REG_EQUIV note may also
+     appear on an insn which copies a register parameter to a pseudo-register,
+     if there is a memory address which could be used to hold that
+     pseudo-register throughout the function.  */
+   REG_EQUIV,
+
+  /* Like REG_EQUIV except that the destination is only momentarily equal
+     to the specified rtx.  Therefore, it cannot be used for substitution;
+     but it can be used for cse.  */
+  REG_EQUAL,
+
+  /* The register set in this insn held 0 before the insn.  The contents of
+     the note is the insn that stored the 0.  If that insn is deleted or
+     patched to a NOTE, the REG_WAS_0 is inoperative.  The REG_WAS_0 note
+     is actually an INSN_LIST, not an EXPR_LIST.  */
+  REG_WAS_0,
+
+  /* This insn copies the return-value of a library call out of the hard reg
+     for return values.  This note is actually an INSN_LIST and it points to
+     the first insn involved in setting up arguments for the call.  flow.c
+     uses this to delete the entire library call when its result is dead.  */
+  REG_RETVAL,
+
+  /* The inverse of REG_RETVAL: it goes on the first insn of the library call
+     and points at the one that has the REG_RETVAL.  */
+  REG_LIBCALL,
+
+  /* The register is always nonnegative during the containing loop.  This is
+     used in branches so that decrement and branch instructions terminating
+     on zero can be matched.  There must be an insn pattern in the md file
+     named `decrement_and_branch_until_zero' or else this will never be added
+     to any instructions.  */
+  REG_NONNEG,
+
+  /* There is no conflict *after this insn* between the register in the note
+     and the destination of this insn.  */
+  REG_NO_CONFLICT,
+
+  /* Identifies a register set in this insn and never used.  */
+  REG_UNUSED,
+
+  /* REG_CC_SETTER and REG_CC_USER link a pair of insns that set and use CC0,
+     respectively.  Normally, these are required to be consecutive insns, but
+     we permit putting a cc0-setting insn in the delay slot of a branch as
+     long as only one copy of the insn exists.  In that case, these notes
+     point from one to the other to allow code generation to determine what
+     any require information and to properly update CC_STATUS.  */
+  REG_CC_SETTER, REG_CC_USER,
+
+  /* Points to a CODE_LABEL.  Used by non-JUMP_INSNs to say that the
+     CODE_LABEL contained in the REG_LABEL note is used by the insn.  */
+  REG_LABEL,
+
+  /* REG_DEP_ANTI and REG_DEP_OUTPUT are used in LOG_LINKS to represent
+     write-after-read and write-after-write dependencies respectively.
+     Data dependencies, which are the only type of LOG_LINK created by
+     flow, are represented by a 0 reg note kind.  */
+  REG_DEP_ANTI, REG_DEP_OUTPUT,
+
+  /* REG_BR_PROB is attached to JUMP_INSNs and CALL_INSNs when the flag
+     -fbranch-probabilities is given.  It has an integer value.  For jumps,
+     it is the probability that this is a taken branch.  For calls, it is
+     the probability that this call won't return.  */
+  REG_BR_PROB,
+
+  /* REG_EXEC_COUNT is attached to the first insn of each basic block, and
+     the first insn after each CALL_INSN.  It indicates how many times this
+     block was executed.  */
+  REG_EXEC_COUNT,
+
+  /* Attached to a call insn; indicates that the call is malloc-like and
+     that the pointer returned cannot alias anything else.  */
+  REG_NOALIAS,
+
+  /* Used to optimize rtl generated by dynamic stack allocations for targets
+     where SETJMP_VIA_SAVE_AREA is true.  */
+  REG_SAVE_AREA,
+
+  /* Attached to JUMP_INSNs only, it holds the branch prediction flags
+     computed by get_jump_flags() after dbr scheduling is complete.  */
+  REG_BR_PRED,
+
+  /* Attached to insns that are RTX_FRAME_RELATED_P, but are too complex
+     for DWARF to interpret what they imply.  The attached rtx is used
+     instead of intuition.  */
+  REG_FRAME_RELATED_EXPR,
+
+  /* Indicates that REG holds the exception context for the function.
+     This context is shared by inline functions, so the code to acquire
+     the real exception context is delayed until after inlining.  */
+  REG_EH_CONTEXT,
+
+  /* Indicates what exception region an INSN belongs in.  This is used to
+     indicate what region to which a call may throw.  REGION 0 indicates
+     that a call cannot throw at all.  REGION -1 indicates that it cannot
+     throw, nor will it execute a non-local goto.  */
+  REG_EH_REGION,
+
+  /* Indicates that a call is actually a call to rethrow, and specifies the
+     rethrow symbol for the region the rethrow is targetting.  This provides
+     a way to generate the non standard flow edges required for a rethrow.  */
+  REG_EH_RETHROW,
+
+  /* Used by haifa-sched to save NOTE_INSN notes across scheduling.  */
+  REG_SAVE_NOTE
+};
+
 /* The base value for branch probability notes.  */
 #define REG_BR_PROB_BASE  10000
 
@@ -517,16 +572,12 @@ extern const char * const reg_note_name[];
    information as a rtx in the field.  */
 
 #define NOTE_SOURCE_FILE(INSN)         XCSTR(INSN, 3, NOTE)
-#define NOTE_BLOCK_NUMBER(INSN)        XCINT(INSN, 3, NOTE)
+#define NOTE_BLOCK(INSN)       XCTREE(INSN, 3, NOTE)
 #define NOTE_EH_HANDLER(INSN)  XCINT(INSN, 3, NOTE)
 #define NOTE_RANGE_INFO(INSN)          XCEXP(INSN, 3, NOTE)
 #define NOTE_LIVE_INFO(INSN)           XCEXP(INSN, 3, NOTE)
 #define NOTE_BASIC_BLOCK(INSN) XCBBDEF(INSN, 3, NOTE)
 
-/* If the NOTE_BLOCK_NUMBER field gets a -1, it means create a new
-   block node for a live range block.  */
-#define NOTE_BLOCK_LIVE_RANGE_BLOCK -1
-
 /* In a NOTE that is a line number, this is the line number.
    Other kinds of NOTEs are identified by negative numbers here.  */
 #define NOTE_LINE_NUMBER(INSN) XCINT(INSN, 4, NOTE)
@@ -603,8 +654,11 @@ extern const char * const note_insn_name[];
    of LABEL_REFs that point at it, so unused labels can be deleted.  */
 #define LABEL_NUSES(RTX) XCINT(RTX, 5, CODE_LABEL)
 
+/* Associate a name with a CODE_LABEL.  */
+#define LABEL_ALTERNATE_NAME(RTX) XCSTR(RTX, 7, CODE_LABEL)
+
 /* The original regno this ADDRESSOF was built for.  */
-#define ADDRESSOF_REGNO(RTX) XCINT(RTX, 1, ADDRESSOF)
+#define ADDRESSOF_REGNO(RTX) XCUINT(RTX, 1, ADDRESSOF)
 
 /* The variable in the register we took the address of.  */
 #define ADDRESSOF_DECL(RTX) XCTREE(RTX, 2, ADDRESSOF)
@@ -633,7 +687,7 @@ extern const char * const note_insn_name[];
 
 /* For a REG rtx, REGNO extracts the register number.  */
 
-#define REGNO(RTX) XCINT(RTX, 0, REG)
+#define REGNO(RTX) XCUINT(RTX, 0, REG)
 
 /* For a REG rtx, REG_FUNCTION_VALUE_P is nonzero if the reg
    is the current function's return value.  */
@@ -651,12 +705,12 @@ extern const char * const note_insn_name[];
    SUBREG_WORD extracts the word-number.  */
 
 #define SUBREG_REG(RTX) XCEXP(RTX, 0, SUBREG)
-#define SUBREG_WORD(RTX) XCINT(RTX, 1, SUBREG)
+#define SUBREG_WORD(RTX) XCUINT(RTX, 1, SUBREG)
 
 /* 1 if the REG contained in SUBREG_REG is already known to be
    sign- or zero-extended from the mode of the SUBREG to the mode of
    the reg.  SUBREG_PROMOTED_UNSIGNED_P gives the signedness of the
-   extension.  
+   extension.
 
    When used as a LHS, is means that this extension must be done
    when assigning to SUBREG_REG.  */
@@ -753,6 +807,12 @@ extern const char * const note_insn_name[];
 #define TRAP_CONDITION(RTX) XCEXP(RTX, 0, TRAP_IF)
 #define TRAP_CODE(RTX) XCEXP(RTX, 1, TRAP_IF)
 
+/* For a COND_EXEC rtx, COND_EXEC_TEST is the condition to base
+   conditionally executing the code on, COND_EXEC_CODE is the code
+   to execute if the condition is true.  */
+#define COND_EXEC_TEST(RTX) XCEXP(RTX, 0, COND_EXEC)
+#define COND_EXEC_CODE(RTX) XCEXP(RTX, 1, COND_EXEC)
+
 /* 1 in a SYMBOL_REF if it addresses this function's constants pool.  */
 #define CONSTANT_POOL_ADDRESS_P(RTX) ((RTX)->unchanging)
 
@@ -930,6 +990,12 @@ extern const char * const note_insn_name[];
 
 /* For a NOTE_INSN_LIVE note, the original basic block number.  */
 #define RANGE_LIVE_ORIG_BLOCK(INSN) (XINT (INSN, 1))
+
+/* Determine if the insn is a PHI node.  */
+#define PHI_NODE_P(X)                          \
+  (X && GET_CODE (X) == INSN                   \
+   && GET_CODE (PATTERN (X)) == SET            \
+   && GET_CODE (SET_SRC (PATTERN (X))) == PHI)
 \f
 /* Nonzero if we need to distinguish between the return value of this function
    and the return value of a function called by this function.  This helps
@@ -947,11 +1013,11 @@ extern int rtx_equal_function_value_matters;
 #define exact_log2(N) exact_log2_wide ((unsigned HOST_WIDE_INT) (N))
 #define floor_log2(N) floor_log2_wide ((unsigned HOST_WIDE_INT) (N))
 #endif
-extern int exact_log2_wide             PROTO((unsigned HOST_WIDE_INT));
-extern int floor_log2_wide             PROTO((unsigned HOST_WIDE_INT));
+extern int exact_log2_wide             PARAMS ((unsigned HOST_WIDE_INT));
+extern int floor_log2_wide             PARAMS ((unsigned HOST_WIDE_INT));
 
 /* In expmed.c */
-extern int ceil_log2                   PROTO((unsigned HOST_WIDE_INT));
+extern int ceil_log2                   PARAMS ((unsigned HOST_WIDE_INT));
 
 #define plus_constant(X,C) plus_constant_wide (X, (HOST_WIDE_INT) (C))
 
@@ -959,191 +1025,211 @@ extern int ceil_log2                   PROTO((unsigned HOST_WIDE_INT));
   plus_constant_for_output_wide (X, (HOST_WIDE_INT) (C))
 
 /* In explow.c */
-extern HOST_WIDE_INT trunc_int_for_mode        PROTO((HOST_WIDE_INT,
+extern void set_stack_check_libfunc PARAMS ((rtx));
+extern HOST_WIDE_INT trunc_int_for_mode        PARAMS ((HOST_WIDE_INT,
                                               enum machine_mode));
-extern rtx plus_constant_wide           PROTO((rtx, HOST_WIDE_INT));
-extern rtx plus_constant_for_output_wide PROTO((rtx, HOST_WIDE_INT));
-extern void optimize_save_area_alloca  PROTO((rtx));
+extern rtx plus_constant_wide           PARAMS ((rtx, HOST_WIDE_INT));
+extern rtx plus_constant_for_output_wide PARAMS ((rtx, HOST_WIDE_INT));
+extern void optimize_save_area_alloca  PARAMS ((rtx));
 
-extern rtx gen_rtx                     PVPROTO((enum rtx_code,
+extern rtx gen_rtx                     PARAMS ((enum rtx_code,
                                                 enum machine_mode, ...));
-extern rtvec gen_rtvec                 PVPROTO((int, ...));
-
-#ifdef BUFSIZ
-extern rtx read_rtx                    PROTO((FILE *));
-#endif
-
-extern char *oballoc                   PROTO((int));
-extern char *permalloc                 PROTO((int));
-extern rtx rtx_alloc                   PROTO((RTX_CODE));
-extern rtvec rtvec_alloc               PROTO((int));
-extern rtx copy_rtx                    PROTO((rtx));
-extern rtx copy_rtx_if_shared          PROTO((rtx));
-extern rtx copy_most_rtx               PROTO((rtx, rtx));
-extern rtx shallow_copy_rtx            PROTO((rtx));
-extern rtvec gen_rtvec_v               PROTO((int, rtx *));
-extern rtx gen_reg_rtx                 PROTO((enum machine_mode));
-extern rtx gen_label_rtx               PROTO((void));
-extern rtx gen_lowpart_common          PROTO((enum machine_mode, rtx));
-extern rtx gen_lowpart                 PROTO((enum machine_mode, rtx));
-extern rtx gen_lowpart_if_possible     PROTO((enum machine_mode, rtx));
-extern rtx gen_highpart                        PROTO((enum machine_mode, rtx));
-extern rtx gen_realpart                        PROTO((enum machine_mode, rtx));
-extern rtx gen_imagpart                        PROTO((enum machine_mode, rtx));
-extern rtx operand_subword             PROTO((rtx, int, int, enum machine_mode));
-extern rtx operand_subword_force       PROTO((rtx, int, enum machine_mode));
-extern int subreg_lowpart_p            PROTO((rtx));
-extern rtx make_safe_from              PROTO((rtx, rtx));
-extern rtx convert_memory_address      PROTO((enum machine_mode, rtx));
-extern rtx memory_address              PROTO((enum machine_mode, rtx));
-extern rtx get_insns                   PROTO((void));
-extern rtx get_last_insn               PROTO((void));
-extern rtx get_last_insn_anywhere      PROTO((void));
-extern void start_sequence             PROTO((void));
-extern void push_to_sequence           PROTO((rtx));
-extern void end_sequence               PROTO((void));
-extern rtx gen_sequence                        PROTO((void));
-extern rtx immed_double_const          PROTO((HOST_WIDE_INT, HOST_WIDE_INT, enum machine_mode));
-extern rtx force_const_mem             PROTO((enum machine_mode, rtx));
-extern rtx force_reg                   PROTO((enum machine_mode, rtx));
-extern rtx get_pool_constant           PROTO((rtx));
-extern enum machine_mode get_pool_mode PROTO((rtx));
-extern rtx get_pool_constant_for_function      PROTO((struct function *, rtx));
-extern enum machine_mode get_pool_mode_for_function    PROTO((struct function *, rtx));
-extern int get_pool_offset             PROTO((rtx));
-extern rtx simplify_subtraction                PROTO((rtx));
-extern rtx assign_stack_local          PROTO((enum machine_mode,
+extern rtvec gen_rtvec                 PARAMS ((int, ...));
+
+extern char *oballoc                   PARAMS ((int));
+extern char *permalloc                 PARAMS ((int));
+extern rtx rtx_alloc                   PARAMS ((RTX_CODE));
+extern rtvec rtvec_alloc               PARAMS ((int));
+extern rtx copy_insn_1                 PARAMS ((rtx));
+extern rtx copy_insn                   PARAMS ((rtx));
+extern rtx copy_rtx                    PARAMS ((rtx));
+extern rtx copy_rtx_if_shared          PARAMS ((rtx));
+extern rtx copy_most_rtx               PARAMS ((rtx, rtx));
+extern rtx shallow_copy_rtx            PARAMS ((rtx));
+extern int rtx_equal_p                  PARAMS ((rtx, rtx));
+extern rtvec gen_rtvec_v               PARAMS ((int, rtx *));
+extern rtx gen_reg_rtx                 PARAMS ((enum machine_mode));
+extern rtx gen_label_rtx               PARAMS ((void));
+extern rtx gen_lowpart_common          PARAMS ((enum machine_mode, rtx));
+extern rtx gen_lowpart                 PARAMS ((enum machine_mode, rtx));
+extern rtx gen_lowpart_if_possible     PARAMS ((enum machine_mode, rtx));
+extern rtx gen_highpart                        PARAMS ((enum machine_mode, rtx));
+extern rtx gen_realpart                        PARAMS ((enum machine_mode, rtx));
+extern rtx gen_imagpart                        PARAMS ((enum machine_mode, rtx));
+extern rtx operand_subword             PARAMS ((rtx, unsigned int, int,
+                                                enum machine_mode));
+extern rtx operand_subword_force       PARAMS ((rtx, unsigned int,
+                                                enum machine_mode));
+extern int subreg_lowpart_p            PARAMS ((rtx));
+extern rtx make_safe_from              PARAMS ((rtx, rtx));
+extern rtx convert_memory_address      PARAMS ((enum machine_mode, rtx));
+extern rtx memory_address              PARAMS ((enum machine_mode, rtx));
+extern rtx get_insns                   PARAMS ((void));
+extern const char *get_insn_name       PARAMS ((int));
+extern rtx get_last_insn               PARAMS ((void));
+extern rtx get_last_insn_anywhere      PARAMS ((void));
+extern void start_sequence             PARAMS ((void));
+extern void push_to_sequence           PARAMS ((rtx));
+extern void end_sequence               PARAMS ((void));
+extern void push_to_full_sequence      PARAMS ((rtx, rtx));
+extern void end_full_sequence          PARAMS ((rtx*, rtx*));
+extern rtx gen_sequence                        PARAMS ((void));
+extern rtx immed_double_const          PARAMS ((HOST_WIDE_INT, HOST_WIDE_INT, enum machine_mode));
+extern rtx force_const_mem             PARAMS ((enum machine_mode, rtx));
+extern rtx force_reg                   PARAMS ((enum machine_mode, rtx));
+extern rtx get_pool_constant           PARAMS ((rtx));
+extern enum machine_mode get_pool_mode PARAMS ((rtx));
+extern rtx get_pool_constant_for_function      PARAMS ((struct function *, rtx));
+extern enum machine_mode get_pool_mode_for_function    PARAMS ((struct function *, rtx));
+extern int get_pool_offset             PARAMS ((rtx));
+extern rtx simplify_subtraction                PARAMS ((rtx));
+extern rtx assign_stack_local          PARAMS ((enum machine_mode,
                                               HOST_WIDE_INT, int));
-extern rtx assign_stack_temp           PROTO((enum machine_mode,
+extern rtx assign_stack_temp           PARAMS ((enum machine_mode,
                                               HOST_WIDE_INT, int));
-extern rtx assign_temp                 PROTO((union tree_node *,
+extern rtx assign_temp                 PARAMS ((union tree_node *,
                                               int, int, int));
-extern rtx protect_from_queue          PROTO((rtx, int));
-extern void emit_queue                 PROTO((void));
-extern rtx emit_move_insn              PROTO((rtx, rtx));
-extern rtx emit_insn_before            PROTO((rtx, rtx));
-extern rtx emit_jump_insn_before       PROTO((rtx, rtx));
-extern rtx emit_call_insn_before       PROTO((rtx, rtx));
-extern rtx emit_barrier_before         PROTO((rtx));
-extern rtx emit_label_before           PROTO((rtx, rtx));
-extern rtx emit_note_before            PROTO((int, rtx));
-extern rtx emit_insn_after             PROTO((rtx, rtx));
-extern rtx emit_jump_insn_after                PROTO((rtx, rtx));
-extern rtx emit_barrier_after          PROTO((rtx));
-extern rtx emit_label_after            PROTO((rtx, rtx));
-extern rtx emit_note_after             PROTO((int, rtx));
-extern rtx emit_line_note_after                PROTO((char *, int, rtx));
-extern rtx emit_insn                   PROTO((rtx));
-extern rtx emit_insns                  PROTO((rtx));
-extern rtx emit_insns_before           PROTO((rtx, rtx));
-extern rtx emit_insns_after            PROTO((rtx, rtx));
-extern rtx emit_jump_insn              PROTO((rtx));
-extern rtx emit_call_insn              PROTO((rtx));
-extern rtx emit_label                  PROTO((rtx));
-extern rtx emit_barrier                        PROTO((void));
-extern rtx emit_line_note              PROTO((char *, int));
-extern rtx emit_note                   PROTO((char *, int));
-extern rtx emit_line_note_force                PROTO((char *, int));
-extern rtx make_insn_raw               PROTO((rtx));
-extern rtx previous_insn               PROTO((rtx));
-extern rtx next_insn                   PROTO((rtx));
-extern rtx prev_nonnote_insn           PROTO((rtx));
-extern rtx next_nonnote_insn           PROTO((rtx));
-extern rtx prev_real_insn              PROTO((rtx));
-extern rtx next_real_insn              PROTO((rtx));
-extern rtx prev_active_insn            PROTO((rtx));
-extern rtx next_active_insn            PROTO((rtx));
-extern rtx prev_label                  PROTO((rtx));
-extern rtx next_label                  PROTO((rtx));
-extern rtx next_cc0_user               PROTO((rtx));
-extern rtx prev_cc0_setter             PROTO((rtx));
-extern rtx next_nondeleted_insn                PROTO((rtx));
-extern enum rtx_code reverse_condition PROTO((enum rtx_code));
-extern enum rtx_code swap_condition    PROTO((enum rtx_code));
-extern enum rtx_code unsigned_condition        PROTO((enum rtx_code));
-extern enum rtx_code signed_condition  PROTO((enum rtx_code));
-extern rtx find_equiv_reg              PROTO((rtx, rtx, enum reg_class, int, short *, int, enum machine_mode));
-extern rtx squeeze_notes               PROTO((rtx, rtx));
-extern rtx delete_insn                 PROTO((rtx));
-extern void delete_jump                        PROTO((rtx));
-extern rtx get_label_before            PROTO((rtx));
-extern rtx get_label_after             PROTO((rtx));
-extern rtx follow_jumps                        PROTO((rtx));
-extern rtx adj_offsettable_operand     PROTO((rtx, int));
-extern rtx try_split                   PROTO((rtx, rtx, int));
-extern rtx split_insns                 PROTO((rtx, rtx));
-extern rtx simplify_unary_operation    PROTO((enum rtx_code, enum machine_mode, rtx, enum machine_mode));
-extern rtx simplify_binary_operation   PROTO((enum rtx_code, enum machine_mode, rtx, rtx));
-extern rtx simplify_ternary_operation  PROTO((enum rtx_code, enum machine_mode, enum machine_mode, rtx, rtx, rtx));
-extern rtx simplify_relational_operation PROTO((enum rtx_code, enum machine_mode, rtx, rtx));
-extern rtx gen_move_insn               PROTO((rtx, rtx));
-extern rtx gen_jump                    PROTO((rtx));
-extern rtx gen_beq                     PROTO((rtx));
-extern rtx gen_bge                     PROTO((rtx));
-extern rtx gen_ble                     PROTO((rtx));
-extern rtx gen_mem_addressof           PROTO((rtx, union tree_node *));
-extern rtx eliminate_constant_term     PROTO((rtx, rtx *));
-extern rtx expand_complex_abs          PROTO((enum machine_mode, rtx, rtx, int));
-extern enum machine_mode choose_hard_reg_mode PROTO((int, int));
-extern void set_unique_reg_note         PROTO((rtx, enum reg_note, rtx));
+extern rtx protect_from_queue          PARAMS ((rtx, int));
+extern void emit_queue                 PARAMS ((void));
+extern rtx emit_move_insn              PARAMS ((rtx, rtx));
+extern rtx emit_insn_before            PARAMS ((rtx, rtx));
+extern rtx emit_jump_insn_before       PARAMS ((rtx, rtx));
+extern rtx emit_call_insn_before       PARAMS ((rtx, rtx));
+extern rtx emit_barrier_before         PARAMS ((rtx));
+extern rtx emit_label_before           PARAMS ((rtx, rtx));
+extern rtx emit_note_before            PARAMS ((int, rtx));
+extern rtx emit_insn_after             PARAMS ((rtx, rtx));
+extern rtx emit_jump_insn_after                PARAMS ((rtx, rtx));
+extern rtx emit_barrier_after          PARAMS ((rtx));
+extern rtx emit_label_after            PARAMS ((rtx, rtx));
+extern rtx emit_note_after             PARAMS ((int, rtx));
+extern rtx emit_line_note_after                PARAMS ((const char *, int, rtx));
+extern rtx emit_insn                   PARAMS ((rtx));
+extern rtx emit_insns                  PARAMS ((rtx));
+extern rtx emit_insns_before           PARAMS ((rtx, rtx));
+extern rtx emit_insns_after            PARAMS ((rtx, rtx));
+extern rtx emit_jump_insn              PARAMS ((rtx));
+extern rtx emit_call_insn              PARAMS ((rtx));
+extern rtx emit_label                  PARAMS ((rtx));
+extern rtx emit_barrier                        PARAMS ((void));
+extern rtx emit_line_note              PARAMS ((const char *, int));
+extern rtx emit_note                   PARAMS ((const char *, int));
+extern rtx emit_line_note_force                PARAMS ((const char *, int));
+extern rtx make_insn_raw               PARAMS ((rtx));
+extern rtx previous_insn               PARAMS ((rtx));
+extern rtx next_insn                   PARAMS ((rtx));
+extern rtx prev_nonnote_insn           PARAMS ((rtx));
+extern rtx next_nonnote_insn           PARAMS ((rtx));
+extern rtx prev_real_insn              PARAMS ((rtx));
+extern rtx next_real_insn              PARAMS ((rtx));
+extern rtx prev_active_insn            PARAMS ((rtx));
+extern rtx next_active_insn            PARAMS ((rtx));
+extern int active_insn_p               PARAMS ((rtx));
+extern rtx prev_label                  PARAMS ((rtx));
+extern rtx next_label                  PARAMS ((rtx));
+extern rtx next_cc0_user               PARAMS ((rtx));
+extern rtx prev_cc0_setter             PARAMS ((rtx));
+extern rtx next_nondeleted_insn                PARAMS ((rtx));
+extern enum rtx_code reverse_condition PARAMS ((enum rtx_code));
+extern enum rtx_code reverse_condition_maybe_unordered PARAMS ((enum rtx_code));
+extern enum rtx_code swap_condition    PARAMS ((enum rtx_code));
+extern enum rtx_code unsigned_condition        PARAMS ((enum rtx_code));
+extern enum rtx_code signed_condition  PARAMS ((enum rtx_code));
+extern rtx find_equiv_reg              PARAMS ((rtx, rtx, enum reg_class, int, short *, int, enum machine_mode));
+extern rtx squeeze_notes               PARAMS ((rtx, rtx));
+extern rtx delete_insn                 PARAMS ((rtx));
+extern void delete_jump                        PARAMS ((rtx));
+extern void delete_barrier             PARAMS ((rtx));
+extern rtx get_label_before            PARAMS ((rtx));
+extern rtx get_label_after             PARAMS ((rtx));
+extern rtx follow_jumps                        PARAMS ((rtx));
+extern rtx adj_offsettable_operand     PARAMS ((rtx, int));
+extern rtx try_split                   PARAMS ((rtx, rtx, int));
+extern rtx split_insns                 PARAMS ((rtx, rtx));
+extern rtx simplify_unary_operation    PARAMS ((enum rtx_code, enum machine_mode, rtx, enum machine_mode));
+extern rtx simplify_binary_operation   PARAMS ((enum rtx_code, enum machine_mode, rtx, rtx));
+extern rtx simplify_ternary_operation  PARAMS ((enum rtx_code, enum machine_mode, enum machine_mode, rtx, rtx, rtx));
+extern rtx simplify_relational_operation PARAMS ((enum rtx_code, enum machine_mode, rtx, rtx));
+extern rtx simplify_gen_binary         PARAMS ((enum rtx_code, enum machine_mode,
+                                              rtx, rtx));
+extern rtx simplify_rtx                        PARAMS ((rtx));
+extern rtx gen_move_insn               PARAMS ((rtx, rtx));
+extern rtx gen_jump                    PARAMS ((rtx));
+extern rtx gen_beq                     PARAMS ((rtx));
+extern rtx gen_bge                     PARAMS ((rtx));
+extern rtx gen_ble                     PARAMS ((rtx));
+extern rtx gen_mem_addressof           PARAMS ((rtx, union tree_node *));
+extern rtx eliminate_constant_term     PARAMS ((rtx, rtx *));
+extern rtx expand_complex_abs          PARAMS ((enum machine_mode, rtx, rtx,
+                                                int));
+extern enum machine_mode choose_hard_reg_mode PARAMS ((unsigned int,
+                                                      unsigned int));
+extern void set_unique_reg_note         PARAMS ((rtx, enum reg_note, rtx));
 
 /* Functions in rtlanal.c */
 
-extern int rtx_unstable_p              PROTO((rtx));
-extern int rtx_varies_p                        PROTO((rtx));
-extern int rtx_addr_varies_p           PROTO((rtx));
-extern HOST_WIDE_INT get_integer_term  PROTO((rtx));
-extern rtx get_related_value           PROTO((rtx));
-extern int reg_mentioned_p             PROTO((rtx, rtx));
-extern int reg_referenced_p            PROTO((rtx, rtx));
-extern int reg_used_between_p          PROTO((rtx, rtx, rtx));
-extern int reg_referenced_between_p    PROTO((rtx, rtx, rtx));
-extern int reg_set_between_p           PROTO((rtx, rtx, rtx));
-extern int regs_set_between_p          PROTO((rtx, rtx, rtx));
-extern int modified_between_p          PROTO((rtx, rtx, rtx));
-extern int no_labels_between_p         PROTO((rtx, rtx));
-extern int no_jumps_between_p          PROTO((rtx, rtx));
-extern int modified_in_p               PROTO((rtx, rtx));
-extern int reg_set_p                   PROTO((rtx, rtx));
-extern rtx single_set                  PROTO((rtx));
-extern int multiple_sets               PROTO((rtx));
-extern rtx find_last_value             PROTO((rtx, rtx *, rtx, int));
-extern int refers_to_regno_p           PROTO((int, int, rtx, rtx *));
-extern int reg_overlap_mentioned_p     PROTO((rtx, rtx));
-extern void note_stores                        PROTO((rtx, void (*)(rtx, rtx)));
-extern rtx reg_set_last                        PROTO((rtx, rtx));
-extern int rtx_equal_p                 PROTO((rtx, rtx));
-extern int dead_or_set_p               PROTO((rtx, rtx));
-extern int dead_or_set_regno_p         PROTO((rtx, int));
-extern rtx find_reg_note               PROTO((rtx, enum reg_note, rtx));
-extern rtx find_regno_note             PROTO((rtx, enum reg_note, int));
-extern int find_reg_fusage             PROTO((rtx, enum rtx_code, rtx));
-extern int find_regno_fusage           PROTO((rtx, enum rtx_code, int));
-extern void remove_note                        PROTO((rtx, rtx));
-extern int side_effects_p              PROTO((rtx));
-extern int volatile_refs_p             PROTO((rtx));
-extern int volatile_insn_p             PROTO((rtx));
-extern int may_trap_p                  PROTO((rtx));
-extern int inequality_comparisons_p    PROTO ((rtx));
-extern rtx replace_rtx                 PROTO((rtx, rtx, rtx));
-extern rtx replace_regs                        PROTO((rtx, rtx *, int, int));
-extern int computed_jump_p             PROTO((rtx));
-typedef int (*rtx_function)             PROTO((rtx *, void *));
-extern int for_each_rtx                 PROTO((rtx *, rtx_function, void *));
-extern rtx regno_use_in                        PROTO((int, rtx));
-extern int auto_inc_p                  PROTO((rtx));
-extern void remove_node_from_expr_list PROTO((rtx, rtx *));
+extern int rtx_unstable_p              PARAMS ((rtx));
+extern int rtx_varies_p                        PARAMS ((rtx));
+extern int rtx_addr_varies_p           PARAMS ((rtx));
+extern HOST_WIDE_INT get_integer_term  PARAMS ((rtx));
+extern rtx get_related_value           PARAMS ((rtx));
+extern int reg_mentioned_p             PARAMS ((rtx, rtx));
+extern int reg_referenced_p            PARAMS ((rtx, rtx));
+extern int reg_used_between_p          PARAMS ((rtx, rtx, rtx));
+extern int reg_referenced_between_p    PARAMS ((rtx, rtx, rtx));
+extern int reg_set_between_p           PARAMS ((rtx, rtx, rtx));
+extern int regs_set_between_p          PARAMS ((rtx, rtx, rtx));
+extern int modified_between_p          PARAMS ((rtx, rtx, rtx));
+extern int no_labels_between_p         PARAMS ((rtx, rtx));
+extern int no_jumps_between_p          PARAMS ((rtx, rtx));
+extern int modified_in_p               PARAMS ((rtx, rtx));
+extern int reg_set_p                   PARAMS ((rtx, rtx));
+extern rtx single_set                  PARAMS ((rtx));
+extern int multiple_sets               PARAMS ((rtx));
+extern rtx find_last_value             PARAMS ((rtx, rtx *, rtx, int));
+extern int refers_to_regno_p           PARAMS ((unsigned int, unsigned int,
+                                                rtx, rtx *));
+extern int reg_overlap_mentioned_p     PARAMS ((rtx, rtx));
+extern void note_stores                        PARAMS ((rtx,
+                                                void (*) (rtx, rtx, void *),
+                                                void *));
+extern rtx reg_set_last                        PARAMS ((rtx, rtx));
+extern int dead_or_set_p               PARAMS ((rtx, rtx));
+extern int dead_or_set_regno_p         PARAMS ((rtx, unsigned int));
+extern rtx find_reg_note               PARAMS ((rtx, enum reg_note, rtx));
+extern rtx find_regno_note             PARAMS ((rtx, enum reg_note,
+                                                unsigned int));
+extern int find_reg_fusage             PARAMS ((rtx, enum rtx_code, rtx));
+extern int find_regno_fusage           PARAMS ((rtx, enum rtx_code,
+                                                unsigned int));
+extern void remove_note                        PARAMS ((rtx, rtx));
+extern int side_effects_p              PARAMS ((rtx));
+extern int volatile_refs_p             PARAMS ((rtx));
+extern int volatile_insn_p             PARAMS ((rtx));
+extern int may_trap_p                  PARAMS ((rtx));
+extern int inequality_comparisons_p    PARAMS ((rtx));
+extern rtx replace_rtx                 PARAMS ((rtx, rtx, rtx));
+extern rtx replace_regs                        PARAMS ((rtx, rtx *, unsigned int,
+                                                int));
+extern int computed_jump_p             PARAMS ((rtx));
+typedef int (*rtx_function)             PARAMS ((rtx *, void *));
+extern int for_each_rtx                 PARAMS ((rtx *, rtx_function, void *));
+extern rtx regno_use_in                        PARAMS ((unsigned int, rtx));
+extern int auto_inc_p                  PARAMS ((rtx));
+extern void remove_node_from_expr_list PARAMS ((rtx, rtx *));
+extern int insns_safe_to_move_p         PARAMS ((rtx, rtx, rtx *));
 
 /* flow.c */
 
-extern rtx find_use_as_address         PROTO((rtx, rtx, HOST_WIDE_INT));
-void init_EXPR_INSN_LIST_cache         PROTO((void));
-void free_EXPR_LIST_list               PROTO((rtx *));
-void free_INSN_LIST_list               PROTO((rtx *));
-void free_EXPR_LIST_node               PROTO((rtx));
-void free_INSN_LIST_node               PROTO((rtx));
-rtx alloc_INSN_LIST                    PROTO((rtx, rtx));
-rtx alloc_EXPR_LIST                    PROTO((int, rtx, rtx));
+extern rtx find_use_as_address         PARAMS ((rtx, rtx, HOST_WIDE_INT));
+void init_EXPR_INSN_LIST_cache         PARAMS ((void));
+void free_EXPR_LIST_list               PARAMS ((rtx *));
+void free_INSN_LIST_list               PARAMS ((rtx *));
+void free_EXPR_LIST_node               PARAMS ((rtx));
+void free_INSN_LIST_node               PARAMS ((rtx));
+rtx alloc_INSN_LIST                    PARAMS ((rtx, rtx));
+rtx alloc_EXPR_LIST                    PARAMS ((int, rtx, rtx));
+void clear_log_links                    PARAMS ((rtx));
 
 /* regclass.c */
 
@@ -1154,38 +1240,33 @@ rtx alloc_EXPR_LIST                     PROTO((int, rtx, rtx));
 extern int max_parallel;
 
 /* Free up register info memory.  */
-extern void free_reg_info              PROTO((void));
+extern void free_reg_info              PARAMS ((void));
 
 /* recog.c */
-extern int asm_noperands               PROTO((rtx));
-extern char *decode_asm_operands       PROTO((rtx, rtx *, rtx **,
+extern int asm_noperands               PARAMS ((rtx));
+extern const char *decode_asm_operands PARAMS ((rtx, rtx *, rtx **,
                                               const char **,
                                               enum machine_mode *));
 
-extern enum reg_class reg_preferred_class PROTO((int));
-extern enum reg_class reg_alternate_class PROTO((int));
-
-extern rtx get_first_nonparm_insn      PROTO((void));
+extern enum reg_class reg_preferred_class PARAMS ((int));
+extern enum reg_class reg_alternate_class PARAMS ((int));
 
-extern void split_block_insns          PROTO((int, int));
-extern void update_flow_info           PROTO((rtx, rtx, rtx, rtx));
+extern rtx get_first_nonparm_insn      PARAMS ((void));
 
-/* Standard pieces of rtx, to be substituted directly into things.  */
-#define pc_rtx         (&global_rtl.pc_val)
-#define cc0_rtx                (&global_rtl.cc0_val)
+extern void split_all_insns            PARAMS ((int));
 
 #define MAX_SAVED_CONST_INT 64
-extern struct rtx_def const_int_rtx[MAX_SAVED_CONST_INT * 2 + 1];
+extern rtx const_int_rtx[MAX_SAVED_CONST_INT * 2 + 1];
 
-#define const0_rtx     (&const_int_rtx[MAX_SAVED_CONST_INT])
-#define const1_rtx     (&const_int_rtx[MAX_SAVED_CONST_INT+1])
-#define const2_rtx     (&const_int_rtx[MAX_SAVED_CONST_INT+2])
-#define constm1_rtx    (&const_int_rtx[MAX_SAVED_CONST_INT-1])
+#define const0_rtx     (const_int_rtx[MAX_SAVED_CONST_INT])
+#define const1_rtx     (const_int_rtx[MAX_SAVED_CONST_INT+1])
+#define const2_rtx     (const_int_rtx[MAX_SAVED_CONST_INT+2])
+#define constm1_rtx    (const_int_rtx[MAX_SAVED_CONST_INT-1])
 extern rtx const_true_rtx;
 
 extern rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE];
 
-/* Returns a constant 0 rtx in mode MODE.  Integer modes are treated the 
+/* Returns a constant 0 rtx in mode MODE.  Integer modes are treated the
    same as VOIDmode.  */
 
 #define CONST0_RTX(MODE) (const_tiny_rtx[0][(int) (MODE)])
@@ -1195,24 +1276,64 @@ extern rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE];
 #define CONST1_RTX(MODE) (const_tiny_rtx[1][(int) (MODE)])
 #define CONST2_RTX(MODE) (const_tiny_rtx[2][(int) (MODE)])
 
-extern struct _global_rtl
+/* If HARD_FRAME_POINTER_REGNUM is defined, then a special dummy reg
+   is used to represent the frame pointer.  This is because the
+   hard frame pointer and the automatic variables are separated by an amount
+   that cannot be determined until after register allocation.  We can assume
+   that in this case ELIMINABLE_REGS will be defined, one action of which
+   will be to eliminate FRAME_POINTER_REGNUM into HARD_FRAME_POINTER_REGNUM. */
+#ifndef HARD_FRAME_POINTER_REGNUM
+#define HARD_FRAME_POINTER_REGNUM FRAME_POINTER_REGNUM
+#endif
+
+/* Index labels for global_rtl.  */
+enum global_rtl_index
 {
-  struct rtx_def pc_val, cc0_val;
-  struct rtx_def stack_pointer_val, frame_pointer_val;
-  struct rtx_def hard_frame_pointer_val;
-  struct rtx_def arg_pointer_val;
-  struct rtx_def virtual_incoming_args_val;
-  struct rtx_def virtual_stack_vars_val;
-  struct rtx_def virtual_stack_dynamic_val;
-  struct rtx_def virtual_outgoing_args_val;
-  struct rtx_def virtual_cfa_val;
-} global_rtl;
+  GR_PC,
+  GR_CC0,
+  GR_STACK_POINTER,
+  GR_FRAME_POINTER,
+/* For register elimination to work properly these hard_frame_pointer_rtx,
+   frame_pointer_rtx, and arg_pointer_rtx must be the same if they refer to
+   the same register.  */
+#if FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM
+  GR_ARG_POINTER = GR_FRAME_POINTER,
+#endif
+#if HARD_FRAME_POINTER_REGNUM == FRAME_POINTER_REGNUM
+  GR_HARD_FRAME_POINTER = GR_FRAME_POINTER,
+#else
+  GR_HARD_FRAME_POINTER,
+#endif
+#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
+#if HARD_FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM
+  GR_ARG_POINTER = GR_HARD_FRAME_POINTER,
+#else
+  GR_ARG_POINTER,
+#endif
+#endif
+  GR_VIRTUAL_INCOMING_ARGS,
+  GR_VIRTUAL_STACK_ARGS,
+  GR_VIRTUAL_STACK_DYNAMIC,
+  GR_VIRTUAL_OUTGOING_ARGS,
+  GR_VIRTUAL_CFA,
+
+  GR_MAX
+};
+
+/* Pointers to standard pieces of rtx are stored here.  */
+extern rtx global_rtl[GR_MAX];
+
+/* Standard pieces of rtx, to be substituted directly into things.  */
+#define pc_rtx                  (global_rtl[GR_PC])
+#define cc0_rtx                 (global_rtl[GR_CC0])
 
 /* All references to certain hard regs, except those created
    by allocating pseudo regs into them (when that's possible),
    go through these unique rtx objects.  */
-#define stack_pointer_rtx      (&global_rtl.stack_pointer_val)
-#define frame_pointer_rtx      (&global_rtl.frame_pointer_val)
+#define stack_pointer_rtx       (global_rtl[GR_STACK_POINTER])
+#define frame_pointer_rtx       (global_rtl[GR_FRAME_POINTER])
+#define hard_frame_pointer_rtx (global_rtl[GR_HARD_FRAME_POINTER])
+#define arg_pointer_rtx                (global_rtl[GR_ARG_POINTER])
 
 extern rtx pic_offset_table_rtx;
 extern rtx struct_value_rtx;
@@ -1232,45 +1353,16 @@ extern rtx return_address_pointer_rtx;
    add to this list, modify special_rtx in gengenrtl.c as well.  You
    should also modify gen_rtx to use the special function.  */
 
-extern rtx gen_rtx_CONST_DOUBLE PROTO((enum machine_mode, rtx,
+extern rtx gen_rtx_CONST_DOUBLE PARAMS ((enum machine_mode, rtx,
                                       HOST_WIDE_INT, HOST_WIDE_INT));
-extern rtx gen_rtx_CONST_INT PROTO((enum machine_mode, HOST_WIDE_INT));
-extern rtx gen_rtx_REG PROTO((enum machine_mode, int));
-extern rtx gen_rtx_MEM PROTO((enum machine_mode, rtx));
+extern rtx gen_rtx_CONST_INT PARAMS ((enum machine_mode, HOST_WIDE_INT));
+extern rtx gen_rtx_REG PARAMS ((enum machine_mode, int));
+extern rtx gen_rtx_MEM PARAMS ((enum machine_mode, rtx));
 
 /* We need the cast here to ensure that we get the same result both with
    and without prototypes.  */
 #define GEN_INT(N)  gen_rtx_CONST_INT (VOIDmode, (HOST_WIDE_INT) (N))
 
-/* If HARD_FRAME_POINTER_REGNUM is defined, then a special dummy reg
-   is used to represent the frame pointer.  This is because the
-   hard frame pointer and the automatic variables are separated by an amount
-   that cannot be determined until after register allocation.  We can assume
-   that in this case ELIMINABLE_REGS will be defined, one action of which
-   will be to eliminate FRAME_POINTER_REGNUM into HARD_FRAME_POINTER_REGNUM. */
-#ifndef HARD_FRAME_POINTER_REGNUM
-#define HARD_FRAME_POINTER_REGNUM FRAME_POINTER_REGNUM
-#endif
-
-/* For register elimination to work properly these hard_frame_pointer_rtx,
-   frame_pointer_rtx, and arg_pointer_rtx must be the same if they refer to
-   the same register.  */
-#if HARD_FRAME_POINTER_REGNUM == FRAME_POINTER_REGNUM
-#define hard_frame_pointer_rtx (&global_rtl.frame_pointer_val)
-#else
-#define hard_frame_pointer_rtx (&global_rtl.hard_frame_pointer_val)
-#endif
-
-#if FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM
-#define arg_pointer_rtx                (&global_rtl.frame_pointer_val)
-#else
-#if HARD_FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM
-#define arg_pointer_rtx                (&global_rtl.hard_frame_pointer_val)
-#else
-#define arg_pointer_rtx                (&global_rtl.arg_pointer_val)
-#endif
-#endif
-
 /* Virtual registers are used during RTL generation to refer to locations into
    the stack frame when the actual location isn't known until RTL generation
    is complete.  The routine instantiate_virtual_regs replaces these with
@@ -1283,7 +1375,7 @@ extern rtx gen_rtx_MEM PROTO((enum machine_mode, rtx));
    either by the caller or by the callee when pretending it was passed by the
    caller.  */
 
-#define virtual_incoming_args_rtx (&global_rtl.virtual_incoming_args_val)
+#define virtual_incoming_args_rtx       (global_rtl[GR_VIRTUAL_INCOMING_ARGS])
 
 #define VIRTUAL_INCOMING_ARGS_REGNUM   (FIRST_VIRTUAL_REGISTER)
 
@@ -1291,7 +1383,7 @@ extern rtx gen_rtx_MEM PROTO((enum machine_mode, rtx));
    variable on the stack.  Otherwise, it points to the first variable on
    the stack.  */
 
-#define virtual_stack_vars_rtx (&global_rtl.virtual_stack_vars_val)
+#define virtual_stack_vars_rtx         (global_rtl[GR_VIRTUAL_STACK_ARGS])
 
 #define VIRTUAL_STACK_VARS_REGNUM      ((FIRST_VIRTUAL_REGISTER) + 1)
 
@@ -1299,7 +1391,7 @@ extern rtx gen_rtx_MEM PROTO((enum machine_mode, rtx));
    immediately after the stack pointer has been adjusted by the amount
    desired.  */
 
-#define virtual_stack_dynamic_rtx      (&global_rtl.virtual_stack_dynamic_val)
+#define virtual_stack_dynamic_rtx      (global_rtl[GR_VIRTUAL_STACK_DYNAMIC])
 
 #define VIRTUAL_STACK_DYNAMIC_REGNUM   ((FIRST_VIRTUAL_REGISTER) + 2)
 
@@ -1307,28 +1399,28 @@ extern rtx gen_rtx_MEM PROTO((enum machine_mode, rtx));
    be written when the stack is pre-pushed (arguments pushed using push
    insns always use sp).  */
 
-#define virtual_outgoing_args_rtx      (&global_rtl.virtual_outgoing_args_val)
+#define virtual_outgoing_args_rtx      (global_rtl[GR_VIRTUAL_OUTGOING_ARGS])
 
 #define VIRTUAL_OUTGOING_ARGS_REGNUM   ((FIRST_VIRTUAL_REGISTER) + 3)
 
 /* This points to the Canonical Frame Address of the function.  This
    should corrospond to the CFA produced by INCOMING_FRAME_SP_OFFSET,
    but is calculated relative to the arg pointer for simplicity; the
-   frame pointer nor stack pointer are necessarily fixed relative to 
+   frame pointer nor stack pointer are necessarily fixed relative to
    the CFA until after reload.  */
 
-#define virtual_cfa_rtx                        (&global_rtl.virtual_cfa_val)
+#define virtual_cfa_rtx                        (global_rtl[GR_VIRTUAL_CFA])
 
 #define VIRTUAL_CFA_REGNUM             ((FIRST_VIRTUAL_REGISTER) + 4)
 
 #define LAST_VIRTUAL_REGISTER          ((FIRST_VIRTUAL_REGISTER) + 4)
 
-extern rtx find_next_ref               PROTO((rtx, rtx));
-extern rtx *find_single_use            PROTO((rtx, rtx, rtx *));
+extern rtx find_next_ref               PARAMS ((rtx, rtx));
+extern rtx *find_single_use            PARAMS ((rtx, rtx, rtx *));
 
-extern rtx output_constant_def         PROTO((union tree_node *));
-extern rtx immed_real_const            PROTO((union tree_node *));
-extern union tree_node *make_tree      PROTO((union tree_node *, rtx));
+extern rtx output_constant_def         PARAMS ((union tree_node *));
+extern rtx immed_real_const            PARAMS ((union tree_node *));
+extern union tree_node *make_tree      PARAMS ((union tree_node *, rtx));
 
 /* Define a default value for STORE_FLAG_VALUE.  */
 
@@ -1366,297 +1458,309 @@ extern int no_new_pseudos;
    REAL_ARITHMETIC.  The function returns an int because the caller may not
    know what `enum tree_code' means.  */
 
-extern int rtx_to_tree_code    PROTO((enum rtx_code));
+extern int rtx_to_tree_code    PARAMS ((enum rtx_code));
 
 /* In tree.c */
-extern void obfree                     PROTO ((char *));
+extern void obfree                     PARAMS ((char *));
 struct obstack;
-extern void gcc_obstack_init           PROTO ((struct obstack *));
-extern void pop_obstacks               PROTO ((void));
-extern void push_obstacks              PROTO ((struct obstack *,
+extern void gcc_obstack_init           PARAMS ((struct obstack *));
+extern void pop_obstacks               PARAMS ((void));
+extern void push_obstacks              PARAMS ((struct obstack *,
                                                struct obstack *));
-#ifdef BUFSIZ
-extern int read_skip_spaces            PROTO ((FILE *));
-#endif
-
 /* In cse.c */
 struct cse_basic_block_data;
-extern int rtx_cost                    PROTO ((rtx, enum rtx_code));
-extern void delete_trivially_dead_insns        PROTO ((rtx, int));
+extern int rtx_cost                    PARAMS ((rtx, enum rtx_code));
+extern void delete_trivially_dead_insns        PARAMS ((rtx, int));
 #ifdef BUFSIZ
-extern int cse_main                    PROTO ((rtx, int, int, FILE *));
+extern int cse_main                    PARAMS ((rtx, int, int, FILE *));
 #endif
-extern void cse_end_of_basic_block     PROTO ((rtx,
+extern void cse_end_of_basic_block     PARAMS ((rtx,
                                                struct cse_basic_block_data *,
                                                int, int, int));
 
 /* In jump.c */
-extern int comparison_dominates_p      PROTO ((enum rtx_code, enum rtx_code));
-extern int condjump_p                  PROTO ((rtx));
-extern rtx condjump_label              PROTO ((rtx));
-extern int simplejump_p                        PROTO ((rtx));
-extern int returnjump_p                        PROTO ((rtx));
-extern int onlyjump_p                  PROTO ((rtx));
-extern int sets_cc0_p                  PROTO ((rtx));
-extern int invert_jump                 PROTO ((rtx, rtx));
-extern int rtx_renumbered_equal_p      PROTO ((rtx, rtx));
-extern int true_regnum                 PROTO ((rtx));
-extern int redirect_jump               PROTO ((rtx, rtx));
-extern void jump_optimize              PROTO ((rtx, int, int, int));
-extern void rebuild_jump_labels                PROTO ((rtx));
-extern void thread_jumps               PROTO ((rtx, int, int));
-extern int redirect_exp                        PROTO ((rtx *, rtx, rtx, rtx));
-extern int rtx_equal_for_thread_p      PROTO ((rtx, rtx, rtx));
-extern int invert_exp                  PROTO ((rtx, rtx));
-extern int can_reverse_comparison_p    PROTO ((rtx, rtx));
-extern void delete_for_peephole                PROTO ((rtx, rtx));
-extern int condjump_in_parallel_p      PROTO ((rtx));
-extern void never_reached_warning      PROTO ((rtx));
+extern int comparison_dominates_p      PARAMS ((enum rtx_code, enum rtx_code));
+extern int condjump_p                  PARAMS ((rtx));
+extern rtx condjump_label              PARAMS ((rtx));
+extern int simplejump_p                        PARAMS ((rtx));
+extern int returnjump_p                        PARAMS ((rtx));
+extern int onlyjump_p                  PARAMS ((rtx));
+extern int sets_cc0_p                  PARAMS ((rtx));
+extern int invert_jump                 PARAMS ((rtx, rtx));
+extern int rtx_renumbered_equal_p      PARAMS ((rtx, rtx));
+extern int true_regnum                 PARAMS ((rtx));
+extern int redirect_jump               PARAMS ((rtx, rtx));
+extern void jump_optimize              PARAMS ((rtx, int, int, int));
+extern void jump_optimize_minimal      PARAMS ((rtx));
+extern void rebuild_jump_labels                PARAMS ((rtx));
+extern void thread_jumps               PARAMS ((rtx, int, int));
+extern int redirect_exp                        PARAMS ((rtx *, rtx, rtx, rtx));
+extern int rtx_equal_for_thread_p      PARAMS ((rtx, rtx, rtx));
+extern int invert_exp                  PARAMS ((rtx, rtx));
+extern int can_reverse_comparison_p    PARAMS ((rtx, rtx));
+extern void delete_for_peephole                PARAMS ((rtx, rtx));
+extern int condjump_in_parallel_p      PARAMS ((rtx));
+extern void never_reached_warning      PARAMS ((rtx));
 
 /* Flags for jump_optimize() */
-#define JUMP_CROSS_JUMP                1
-#define JUMP_NOOP_MOVES                1
-#define JUMP_AFTER_REGSCAN     1
+#define JUMP_CROSS_JUMP                        1
+#define JUMP_CROSS_JUMP_DEATH_MATTERS  2
+#define JUMP_NOOP_MOVES                        1
+#define JUMP_AFTER_REGSCAN             1
 
 /* In emit-rtl.c. */
-extern int max_reg_num                         PROTO ((void));
-extern int max_label_num                       PROTO ((void));
-extern int get_first_label_num                 PROTO ((void));
-extern void delete_insns_since                 PROTO ((rtx));
-extern void mark_reg_pointer                   PROTO ((rtx, int));
-extern void mark_user_reg                      PROTO ((rtx));
-extern void reset_used_flags                   PROTO ((rtx));
-extern void reorder_insns                      PROTO ((rtx, rtx, rtx));
-extern int get_max_uid                         PROTO ((void));
-extern int in_sequence_p                       PROTO ((void));
-extern void force_next_line_note               PROTO ((void));
-extern void clear_emit_caches                  PROTO ((void));
-extern void init_emit                          PROTO ((void));
-extern void init_emit_once                     PROTO ((int));
-extern void push_topmost_sequence              PROTO ((void));
-extern void pop_topmost_sequence               PROTO ((void));
-extern int subreg_realpart_p                   PROTO ((rtx));
-extern void reverse_comparison                 PROTO ((rtx));
-extern void set_new_first_and_last_insn                PROTO ((rtx, rtx));
-extern void set_new_first_and_last_label_num   PROTO ((int, int));
-extern void set_new_last_label_num             PROTO ((int));
-extern void unshare_all_rtl                    PROTO ((rtx));
-extern void set_last_insn                      PROTO ((rtx));
-extern void link_cc0_insns                     PROTO ((rtx));
-extern void add_insn                           PROTO ((rtx));
-extern void add_insn_before                    PROTO ((rtx, rtx));
-extern void add_insn_after                     PROTO ((rtx, rtx));
-extern void remove_insn                                PROTO ((rtx));
-extern void reorder_insns_with_line_notes      PROTO ((rtx, rtx, rtx));
-extern void emit_insn_after_with_line_notes    PROTO ((rtx, rtx, rtx));
-extern enum rtx_code classify_insn             PROTO ((rtx));
-extern rtx emit                                        PROTO ((rtx));
+extern int max_reg_num                         PARAMS ((void));
+extern int max_label_num                       PARAMS ((void));
+extern int get_first_label_num                 PARAMS ((void));
+extern void delete_insns_since                 PARAMS ((rtx));
+extern void mark_reg_pointer                   PARAMS ((rtx, int));
+extern void mark_user_reg                      PARAMS ((rtx));
+extern void reset_used_flags                   PARAMS ((rtx));
+extern void reorder_insns                      PARAMS ((rtx, rtx, rtx));
+extern int get_max_uid                         PARAMS ((void));
+extern int in_sequence_p                       PARAMS ((void));
+extern void force_next_line_note               PARAMS ((void));
+extern void clear_emit_caches                  PARAMS ((void));
+extern void init_emit                          PARAMS ((void));
+extern void init_emit_once                     PARAMS ((int));
+extern void push_topmost_sequence              PARAMS ((void));
+extern void pop_topmost_sequence               PARAMS ((void));
+extern int subreg_realpart_p                   PARAMS ((rtx));
+extern void reverse_comparison                 PARAMS ((rtx));
+extern void set_new_first_and_last_insn                PARAMS ((rtx, rtx));
+extern void set_new_first_and_last_label_num   PARAMS ((int, int));
+extern void set_new_last_label_num             PARAMS ((int));
+extern void unshare_all_rtl_again              PARAMS ((rtx));
+extern void set_last_insn                      PARAMS ((rtx));
+extern void link_cc0_insns                     PARAMS ((rtx));
+extern void add_insn                           PARAMS ((rtx));
+extern void add_insn_before                    PARAMS ((rtx, rtx));
+extern void add_insn_after                     PARAMS ((rtx, rtx));
+extern void remove_insn                                PARAMS ((rtx));
+extern void reorder_insns_with_line_notes      PARAMS ((rtx, rtx, rtx));
+extern void emit_insn_after_with_line_notes    PARAMS ((rtx, rtx, rtx));
+extern enum rtx_code classify_insn             PARAMS ((rtx));
+extern rtx emit                                        PARAMS ((rtx));
 /* Query and clear/ restore no_line_numbers.  This is used by the
    switch / case handling in stmt.c to give proper line numbers in
    warnings about unreachable code.  */
-int force_line_numbers PROTO((void));
-void restore_line_number_status PROTO((int old_value));
+int force_line_numbers PARAMS ((void));
+void restore_line_number_status PARAMS ((int old_value));
+extern void renumber_insns                      PARAMS ((FILE *));
+extern void remove_unncessary_notes             PARAMS ((void));
 
 /* In insn-emit.c */
-extern void add_clobbers               PROTO ((rtx, int));
+extern void add_clobbers               PARAMS ((rtx, int));
 
 /* In combine.c */
-extern void combine_instructions       PROTO ((rtx, int));
-extern int extended_count              PROTO ((rtx, enum machine_mode, int));
-extern rtx remove_death                        PROTO ((int, rtx));
+extern int combine_instructions                PARAMS ((rtx, unsigned int));
+extern unsigned int extended_count     PARAMS ((rtx, enum machine_mode, int));
+extern rtx remove_death                        PARAMS ((unsigned int, rtx));
 #ifdef BUFSIZ
-extern void dump_combine_stats         PROTO ((FILE *));
-extern void dump_combine_total_stats   PROTO ((FILE *));
+extern void dump_combine_stats         PARAMS ((FILE *));
+extern void dump_combine_total_stats   PARAMS ((FILE *));
 #endif
 
 /* In sched.c. */
 #ifdef BUFSIZ
-extern void schedule_insns             PROTO ((FILE *));
+extern void schedule_insns             PARAMS ((FILE *));
 #endif
-extern void fix_sched_param            PROTO ((const char *, const char *));
+extern void fix_sched_param            PARAMS ((const char *, const char *));
 
 /* In print-rtl.c */
-extern void debug_rtx                  PROTO ((rtx));
-extern void debug_rtx_list             PROTO ((rtx, int));
-extern rtx debug_rtx_find              PROTO ((rtx, int));
+extern void debug_rtx                  PARAMS ((rtx));
+extern void debug_rtx_list             PARAMS ((rtx, int));
+extern void debug_rtx_range            PARAMS ((rtx, rtx));
+extern rtx debug_rtx_find              PARAMS ((rtx, int));
 #ifdef BUFSIZ
-extern void print_rtl                  PROTO ((FILE *, rtx));
-extern int print_rtl_single            PROTO ((FILE *, rtx));
-extern void print_inline_rtx           PROTO ((FILE *, rtx, int));
+extern void print_rtl                  PARAMS ((FILE *, rtx));
+extern int print_rtl_single            PARAMS ((FILE *, rtx));
+extern void print_inline_rtx           PARAMS ((FILE *, rtx, int));
 #endif
 
 /* In loop.c */
-extern void init_loop                  PROTO ((void));
-extern rtx libcall_other_reg           PROTO ((rtx, rtx));
+extern void init_loop                  PARAMS ((void));
+extern rtx libcall_other_reg           PARAMS ((rtx, rtx));
 #ifdef BUFSIZ
-extern void loop_optimize              PROTO ((rtx, FILE *, int, int));
+extern void loop_optimize              PARAMS ((rtx, FILE *, int, int));
 #endif
-extern void record_excess_regs         PROTO ((rtx, rtx, rtx *));
+extern void record_excess_regs         PARAMS ((rtx, rtx, rtx *));
 
 /* In function.c */
-extern void reposition_prologue_and_epilogue_notes     PROTO ((rtx));
-extern void thread_prologue_and_epilogue_insns         PROTO ((rtx));
-extern int prologue_epilogue_contains                  PROTO ((rtx));
-extern void use_variable                               PROTO ((rtx));
-extern HOST_WIDE_INT get_frame_size                    PROTO ((void));
-extern void preserve_rtl_expr_result                   PROTO ((rtx));
-extern void mark_temp_addr_taken                       PROTO ((rtx));
-extern void update_temp_slot_address                   PROTO ((rtx, rtx));
-extern void use_variable_after                         PROTO ((rtx, rtx));
-extern void purge_addressof                            PROTO ((rtx));
+extern void reposition_prologue_and_epilogue_notes     PARAMS ((rtx));
+extern void thread_prologue_and_epilogue_insns         PARAMS ((rtx));
+extern int prologue_epilogue_contains                  PARAMS ((rtx));
+extern int sibcall_epilogue_contains                   PARAMS ((rtx));
+extern HOST_WIDE_INT get_frame_size                    PARAMS ((void));
+extern void preserve_rtl_expr_result                   PARAMS ((rtx));
+extern void mark_temp_addr_taken                       PARAMS ((rtx));
+extern void update_temp_slot_address                   PARAMS ((rtx, rtx));
+extern void purge_addressof                            PARAMS ((rtx));
 
 /* In reload.c */
-extern int operands_match_p            PROTO ((rtx, rtx));
-extern int safe_from_earlyclobber      PROTO ((rtx, rtx));
+extern int operands_match_p            PARAMS ((rtx, rtx));
+extern int safe_from_earlyclobber      PARAMS ((rtx, rtx));
 
 /* In stmt.c */
-extern void set_file_and_line_for_stmt PROTO ((char *, int));
-extern void expand_null_return         PROTO((void));
-extern void emit_jump                  PROTO ((rtx));
-extern int preserve_subexpressions_p   PROTO ((void));
+extern void set_file_and_line_for_stmt PARAMS ((const char *, int));
+extern void expand_null_return         PARAMS ((void));
+extern void emit_jump                  PARAMS ((rtx));
+extern int preserve_subexpressions_p   PARAMS ((void));
 
 /* In expr.c */
-extern void init_expr_once             PROTO ((void));
-extern void move_by_pieces             PROTO ((rtx, rtx, int, int));
-
-
-/* In stupid.c */
-#ifdef BUFSIZ
-extern void stupid_life_analysis       PROTO ((rtx, int, FILE *));
-#endif
+extern void init_expr_once             PARAMS ((void));
+extern void move_by_pieces             PARAMS ((rtx, rtx, int, unsigned int));
 
 /* In flow.c */
-extern void allocate_bb_life_data      PROTO ((void));
-extern void allocate_reg_life_data     PROTO ((void));
-extern void recompute_reg_usage                PROTO ((rtx, int));
+extern void allocate_bb_life_data      PARAMS ((void));
+extern void allocate_reg_life_data     PARAMS ((void));
+extern void recompute_reg_usage                PARAMS ((rtx, int));
 #ifdef BUFSIZ
-extern void dump_flow_info             PROTO ((FILE *));
+extern void print_rtl_with_bb          PARAMS ((FILE *, rtx));
+extern void dump_flow_info             PARAMS ((FILE *));
 #endif
-extern void free_bb_mem                        PROTO ((void));
-extern void replace_insns               PROTO ((rtx, rtx, rtx, rtx));
 
 /* In expmed.c */
-extern void init_expmed                        PROTO ((void));
-extern void expand_inc                 PROTO ((rtx, rtx));
-extern void expand_dec                 PROTO ((rtx, rtx));
-extern rtx expand_mult_highpart                PROTO ((enum machine_mode, rtx,
+extern void init_expmed                        PARAMS ((void));
+extern void expand_inc                 PARAMS ((rtx, rtx));
+extern void expand_dec                 PARAMS ((rtx, rtx));
+extern rtx expand_mult_highpart                PARAMS ((enum machine_mode, rtx,
                                                unsigned HOST_WIDE_INT, rtx,
                                                int, int));
 
 /* In gcse.c */
 #ifdef BUFSIZ
-extern int gcse_main                   PROTO ((rtx, FILE *));
+extern int gcse_main                   PARAMS ((rtx, FILE *));
 #endif
 
 /* In global.c */
-extern void mark_elimination           PROTO ((int, int));
+extern void mark_elimination           PARAMS ((int, int));
 #ifdef BUFSIZ
-extern int global_alloc                        PROTO ((FILE *));
-extern void dump_global_regs           PROTO ((FILE *));
+extern int global_alloc                        PARAMS ((FILE *));
+extern void dump_global_regs           PARAMS ((FILE *));
 #endif
 #ifdef HARD_CONST
-extern void retry_global_alloc         PROTO ((int, HARD_REG_SET));
+extern void retry_global_alloc         PARAMS ((int, HARD_REG_SET));
 #endif
+extern void build_insn_chain           PARAMS ((rtx));
 
 /* In regclass.c */
-extern int reg_classes_intersect_p     PROTO ((enum reg_class, enum reg_class));
-extern int reg_class_subset_p          PROTO ((enum reg_class, enum reg_class));
-extern void globalize_reg              PROTO ((int));
-extern void init_regs                  PROTO ((void));
-extern void init_reg_sets              PROTO ((void));
-extern void regset_release_memory      PROTO ((void));
-extern void regclass_init              PROTO ((void));
-extern void regclass                   PROTO ((rtx, int));
-extern void reg_scan                   PROTO ((rtx, int, int));
-extern void reg_scan_update            PROTO ((rtx, rtx, int));
-extern void fix_register               PROTO ((char *, int, int));
+extern int reg_classes_intersect_p     PARAMS ((enum reg_class, enum reg_class));
+extern int reg_class_subset_p          PARAMS ((enum reg_class, enum reg_class));
+extern void globalize_reg              PARAMS ((int));
+extern void init_regs                  PARAMS ((void));
+extern void init_reg_sets              PARAMS ((void));
+extern void regset_release_memory      PARAMS ((void));
+extern void regclass_init              PARAMS ((void));
+extern void regclass                   PARAMS ((rtx, int, FILE *));
+extern void reg_scan                   PARAMS ((rtx, unsigned int, int));
+extern void reg_scan_update            PARAMS ((rtx, rtx, unsigned int));
+extern void fix_register               PARAMS ((const char *, int, int));
+
+extern void delete_null_pointer_checks PARAMS ((rtx));
 
 /* In regmove.c */
 #ifdef BUFSIZ
-extern void regmove_optimize           PROTO ((rtx, int, FILE *));
+extern void regmove_optimize           PARAMS ((rtx, int, FILE *));
 #endif
+extern void combine_stack_adjustments  PARAMS ((void));
 
 /* In reorg.c */
 #ifdef BUFSIZ
-extern void dbr_schedule               PROTO ((rtx, FILE *));
+extern void dbr_schedule               PARAMS ((rtx, FILE *));
 #endif
 
 /* In optabs.c */
-extern void init_optabs                        PROTO ((void));
+extern void init_optabs                        PARAMS ((void));
 
 /* In local-alloc.c */
 #ifdef BUFSIZ
-extern void dump_local_alloc           PROTO ((FILE *));
+extern void dump_local_alloc           PARAMS ((FILE *));
 #endif
-extern int local_alloc                 PROTO ((void));
-extern int function_invariant_p                PROTO ((rtx));
+extern int local_alloc                 PARAMS ((void));
+extern int function_invariant_p                PARAMS ((rtx));
 
 /* In reload1.c */
-extern void reload_cse_regs            PROTO ((rtx));
-extern void init_reload                        PROTO ((void));
-extern void mark_home_live             PROTO ((int));
+extern void reload_cse_regs            PARAMS ((rtx));
+extern void init_reload                        PARAMS ((void));
+extern void mark_home_live             PARAMS ((int));
 #ifdef BUFSIZ
-extern int reload                      PROTO ((rtx, int, FILE *));
+extern int reload                      PARAMS ((rtx, int, FILE *));
 #endif
 
 /* In caller-save.c */
-extern void init_caller_save           PROTO ((void));
+extern void init_caller_save           PARAMS ((void));
 
 /* In profile.c */
-extern void init_branch_prob           PROTO ((const char *));
+extern void init_branch_prob           PARAMS ((const char *));
 #ifdef BUFSIZ
-extern void branch_prob                        PROTO ((rtx, FILE *));
-extern void end_branch_prob            PROTO ((FILE *));
+extern void branch_prob                        PARAMS ((rtx, FILE *));
+extern void end_branch_prob            PARAMS ((FILE *));
 #endif
-extern void output_func_start_profiler PROTO ((void));
+extern void output_func_start_profiler PARAMS ((void));
 
 /* In reg-stack.c */
 #ifdef BUFSIZ
-extern void reg_to_stack               PROTO ((rtx, FILE *));
+extern void reg_to_stack               PARAMS ((rtx, FILE *));
 #endif
 
 /* In fold-const.c */
-extern int add_double          PROTO ((HOST_WIDE_INT, HOST_WIDE_INT,
-                                       HOST_WIDE_INT, HOST_WIDE_INT,
-                                       HOST_WIDE_INT *, HOST_WIDE_INT *));
-extern int neg_double          PROTO ((HOST_WIDE_INT, HOST_WIDE_INT,
-                                       HOST_WIDE_INT *, HOST_WIDE_INT *));
-extern int mul_double          PROTO ((HOST_WIDE_INT, HOST_WIDE_INT,
-                                       HOST_WIDE_INT, HOST_WIDE_INT,
-                                       HOST_WIDE_INT *, HOST_WIDE_INT *));
-extern void lshift_double      PROTO ((HOST_WIDE_INT, HOST_WIDE_INT,
-                                       HOST_WIDE_INT, int, HOST_WIDE_INT *,
-                                       HOST_WIDE_INT *, int));
-extern void rshift_double      PROTO ((HOST_WIDE_INT, HOST_WIDE_INT,
-                                       HOST_WIDE_INT, int,
-                                       HOST_WIDE_INT *, HOST_WIDE_INT *, int));
-extern void lrotate_double     PROTO ((HOST_WIDE_INT, HOST_WIDE_INT,
-                                       HOST_WIDE_INT, int, HOST_WIDE_INT *,
-                                       HOST_WIDE_INT *));
-extern void rrotate_double     PROTO ((HOST_WIDE_INT, HOST_WIDE_INT,
-                                       HOST_WIDE_INT, int, HOST_WIDE_INT *,
-                                       HOST_WIDE_INT *));
+extern int add_double          PARAMS ((unsigned HOST_WIDE_INT, HOST_WIDE_INT,
+                                        unsigned HOST_WIDE_INT, HOST_WIDE_INT,
+                                        unsigned HOST_WIDE_INT *,
+                                        HOST_WIDE_INT *));
+extern int neg_double          PARAMS ((unsigned HOST_WIDE_INT, HOST_WIDE_INT,
+                                        unsigned HOST_WIDE_INT *,
+                                        HOST_WIDE_INT *));
+extern int mul_double          PARAMS ((unsigned HOST_WIDE_INT,
+                                        HOST_WIDE_INT,
+                                        unsigned HOST_WIDE_INT, HOST_WIDE_INT,
+                                        unsigned HOST_WIDE_INT *,
+                                        HOST_WIDE_INT *));
+extern void lshift_double      PARAMS ((unsigned HOST_WIDE_INT, HOST_WIDE_INT,
+                                        HOST_WIDE_INT, unsigned int,
+                                        unsigned HOST_WIDE_INT *,
+                                        HOST_WIDE_INT *, int));
+extern void rshift_double      PARAMS ((unsigned HOST_WIDE_INT, HOST_WIDE_INT,
+                                        HOST_WIDE_INT, unsigned int,
+                                        unsigned HOST_WIDE_INT *,
+                                        HOST_WIDE_INT *, int));
+extern void lrotate_double     PARAMS ((unsigned HOST_WIDE_INT, HOST_WIDE_INT,
+                                        HOST_WIDE_INT, unsigned int,
+                                        unsigned HOST_WIDE_INT *,
+                                        HOST_WIDE_INT *));
+extern void rrotate_double     PARAMS ((unsigned HOST_WIDE_INT, HOST_WIDE_INT,
+                                        HOST_WIDE_INT, unsigned int,
+                                        unsigned HOST_WIDE_INT *,
+                                        HOST_WIDE_INT *));
 
 /* In calls.c */
-/* Emit library call.  */                                           
-extern void emit_library_call          PVPROTO ((rtx, int, enum machine_mode,
+extern void emit_library_call          PARAMS ((rtx, int, enum machine_mode,
                                                  int, ...));
-extern rtx emit_library_call_value     PVPROTO((rtx, rtx, int,
+extern rtx emit_library_call_value     PARAMS ((rtx, rtx, int,
                                                 enum machine_mode,
                                                 int, ...));
 
 /* In unroll.c */
-extern int set_dominates_use           PROTO ((int, int, int, rtx, rtx));
+extern int set_dominates_use           PARAMS ((int, int, int, rtx, rtx));
 
 /* In varasm.c */
-extern void bss_section                        PROTO ((void));
-extern int in_data_section             PROTO ((void));
-extern int supports_one_only           PROTO ((void));
-extern void init_varasm_once           PROTO ((void));
+extern void bss_section                        PARAMS ((void));
+extern int in_data_section             PARAMS ((void));
+extern int supports_one_only           PARAMS ((void));
+extern void init_varasm_once           PARAMS ((void));
 
 /* In rtl.c */
-extern void init_rtl                   PROTO ((void));
-extern void rtx_free                   PROTO ((rtx));
+extern void init_rtl                   PARAMS ((void));
+extern void rtx_free                   PARAMS ((rtx));
+
+#ifdef BUFSIZ
+extern int read_skip_spaces            PARAMS ((FILE *));
+extern rtx read_rtx                    PARAMS ((FILE *));
+#endif
+
+extern const char *read_rtx_filename;
+extern int read_rtx_lineno;
 
 /* Redefine abort to report an internal error w/o coredump, and
    reporting the location of the error in the source file.  This logic
@@ -1664,31 +1768,50 @@ extern void rtx_free                    PROTO ((rtx));
    special abort includes one or both.  toplev.h gets too few files,
    system.h gets too many.  */
 
-extern void fancy_abort PROTO((const char *, int, const char *))
+extern void fancy_abort PARAMS ((const char *, int, const char *))
     ATTRIBUTE_NORETURN;
-#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
-#define abort() fancy_abort (__FILE__, __LINE__, 0)
-#else
+#if (GCC_VERSION >= 2007)
 #define abort() fancy_abort (__FILE__, __LINE__, __PRETTY_FUNCTION__)
+#else
+#define abort() fancy_abort (__FILE__, __LINE__, 0)
 #endif
 
 /* In alias.c */
-extern int true_dependence             PROTO ((rtx, enum machine_mode, rtx,
+extern rtx canon_rtx                    PARAMS ((rtx));
+extern int true_dependence             PARAMS ((rtx, enum machine_mode, rtx,
                                                int (*)(rtx)));
-extern int read_dependence             PROTO ((rtx, rtx));
-extern int anti_dependence             PROTO ((rtx, rtx));
-extern int output_dependence           PROTO ((rtx, rtx));
-extern void mark_constant_function     PROTO ((void));
-extern void init_alias_once            PROTO ((void));
-extern void init_alias_analysis                PROTO ((void));
-extern void end_alias_analysis         PROTO ((void));
-
-extern void record_base_value          PROTO ((int, rtx, int));
-extern void record_alias_subset         PROTO ((int, int));
-extern rtx addr_side_effect_eval       PROTO ((rtx, int, int));
+extern int read_dependence             PARAMS ((rtx, rtx));
+extern int anti_dependence             PARAMS ((rtx, rtx));
+extern int output_dependence           PARAMS ((rtx, rtx));
+extern void mark_constant_function     PARAMS ((void));
+extern void init_alias_once            PARAMS ((void));
+extern void init_alias_analysis                PARAMS ((void));
+extern void end_alias_analysis         PARAMS ((void));
+
+extern void record_base_value          PARAMS ((int, rtx, int));
+extern void record_alias_subset         PARAMS ((int, int));
+extern rtx addr_side_effect_eval       PARAMS ((rtx, int, int));
+
+/* In sibcall.c */
+typedef enum {
+  sibcall_use_normal = 1,
+  sibcall_use_tail_recursion,
+  sibcall_use_sibcall
+} sibcall_use_t;
+
+extern void optimize_sibling_and_tail_recursive_calls PARAMS ((void));
+extern void replace_call_placeholder   PARAMS ((rtx, sibcall_use_t));
 
 #ifdef STACK_REGS
-extern int stack_regs_mentioned                PROTO((rtx insn));
+extern int stack_regs_mentioned                PARAMS ((rtx insn));
 #endif
 
+/* In toplev.c */
+
+extern rtx stack_limit_rtx;
+
+/* In regrename.c */
+
+extern void regrename_optimize         PARAMS ((void));
+
 #endif /* _RTL_H */