OSDN Git Service

* config/alpha/alpha.c (alpha_emit_floatuns): Ensure we pass a REG
[pf3gnuchains/gcc-fork.git] / gcc / rtl.h
index cdabfdb..c22727e 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -87,11 +87,13 @@ typedef union rtunion_def
 {
   HOST_WIDE_INT rtwint;
   int rtint;
+  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;
@@ -118,9 +120,12 @@ typedef struct rtx_def
 #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
@@ -144,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.
@@ -158,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.  */
@@ -169,7 +174,7 @@ 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;
@@ -330,9 +335,11 @@ extern void rtvec_check_failed_bounds PARAMS ((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)
@@ -341,6 +348,7 @@ extern void rtvec_check_failed_bounds PARAMS ((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))
@@ -349,6 +357,9 @@ extern void rtvec_check_failed_bounds PARAMS ((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)
@@ -377,6 +388,9 @@ extern void rtvec_check_failed_bounds PARAMS ((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)
@@ -387,99 +401,141 @@ extern void rtvec_check_failed_bounds PARAMS ((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.
-     REG_SAVE_NOTE is used by haifa-sched to save NOTE_INSN notes 
-   across scheduling.  */
+   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, REG_SAVE_NOTE = 25 };
+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
 
@@ -602,7 +658,7 @@ extern const char * const note_insn_name[];
 #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)
@@ -631,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.  */
@@ -649,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.  */
@@ -751,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)
 
@@ -928,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
@@ -988,8 +1056,10 @@ 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, int, int, enum machine_mode));
-extern rtx operand_subword_force       PARAMS ((rtx, int, enum machine_mode));
+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));
@@ -1001,6 +1071,8 @@ 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));
@@ -1088,8 +1160,10 @@ 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 ((int, int));
+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 */
@@ -1113,16 +1187,21 @@ 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 ((int, int, rtx, rtx *));
+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 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, int));
+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, int));
+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, int));
+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));
@@ -1130,11 +1209,12 @@ 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 *, int, int));
+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 ((int, rtx));
+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 *));
@@ -1186,7 +1266,7 @@ 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)])
@@ -1326,7 +1406,7 @@ extern rtx gen_rtx_MEM PARAMS ((enum machine_mode, rtx));
 /* 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[GR_VIRTUAL_CFA])
@@ -1411,6 +1491,7 @@ 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));
@@ -1472,9 +1553,9 @@ extern void remove_unncessary_notes             PARAMS ((void));
 extern void add_clobbers               PARAMS ((rtx, int));
 
 /* In combine.c */
-extern int combine_instructions        PARAMS ((rtx, int));
-extern int extended_count              PARAMS ((rtx, enum machine_mode, int));
-extern rtx remove_death                        PARAMS ((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         PARAMS ((FILE *));
 extern void dump_combine_total_stats   PARAMS ((FILE *));
@@ -1489,6 +1570,7 @@ extern void fix_sched_param               PARAMS ((const char *, const char *));
 /* In print-rtl.c */
 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                  PARAMS ((FILE *, rtx));
@@ -1508,6 +1590,7 @@ extern void record_excess_regs            PARAMS ((rtx, rtx, 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));
@@ -1570,8 +1653,8 @@ 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, int, int));
-extern void reg_scan_update            PARAMS ((rtx, rtx, int));
+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));
@@ -1580,6 +1663,7 @@ extern void delete_null_pointer_checks    PARAMS ((rtx));
 #ifdef BUFSIZ
 extern void regmove_optimize           PARAMS ((rtx, int, FILE *));
 #endif
+extern void combine_stack_adjustments  PARAMS ((void));
 
 /* In reorg.c */
 #ifdef BUFSIZ
@@ -1693,6 +1777,7 @@ extern void fancy_abort PARAMS ((const char *, int, const char *))
 #endif
 
 /* In alias.c */
+extern rtx canon_rtx                    PARAMS ((rtx));
 extern int true_dependence             PARAMS ((rtx, enum machine_mode, rtx,
                                                int (*)(rtx)));
 extern int read_dependence             PARAMS ((rtx, rtx));
@@ -1707,16 +1792,26 @@ 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                PARAMS ((rtx insn));
 #endif
 
-/* In ssa.c */
-extern void convert_to_ssa             PARAMS ((void));
-extern void convert_from_ssa           PARAMS ((void));
-
 /* In toplev.c */
 
 extern rtx stack_limit_rtx;
 
+/* In regrename.c */
+
+extern void regrename_optimize         PARAMS ((void));
+
 #endif /* _RTL_H */