OSDN Git Service

Fix for PR 3783.
[pf3gnuchains/gcc-fork.git] / gcc / rtl.h
index de0c37d..d993888 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1,26 +1,26 @@
 /* Register Transfer Language (RTL) definitions for GNU C-Compiler
    Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000 Free Software Foundation, Inc.
+   1999, 2000, 2001 Free Software Foundation, Inc.
 
-This file is part of GNU CC.
+This file is part of GCC.
 
-GNU CC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
 
-GNU CC is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
 
 You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING.  If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+along with GCC; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.  */
 
-#ifndef _RTL_H
-#define _RTL_H
+#ifndef GCC_RTL_H
+#define GCC_RTL_H
 
 struct function;
 
@@ -31,9 +31,9 @@ struct function;
 #undef ABS /* Likewise.  */
 #undef PC /* Likewise.  */
 
-#ifndef TREE_CODE
-union tree_node;
-#endif
+/* Value used by some passes to "recognize" noop moves as valid instructions.
+ */
+#define NOOP_MOVE_INSN_CODE    INT_MAX
 
 /* Register Transfer Language EXPRESSIONS CODES */
 
@@ -89,19 +89,19 @@ typedef union rtunion_def
   int rtint;
   unsigned int rtuint;
   const char *rtstr;
-  struct rtx_def *rtx;
-  struct rtvec_def *rtvec;
+  rtx rtx;
+  rtvec 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;
+  tree rttree;
   struct basic_block_def *bb;
 } rtunion;
 
 /* RTL expression ("rtx").  */
 
-typedef struct rtx_def
+struct rtx_def
 {
   /* The kind of expression this is.  */
   ENUM_BITFIELD(rtx_code) code: 16;
@@ -116,9 +116,10 @@ typedef struct rtx_def
   /* 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
-     manifestly constant.
+  /* 1 in a REG if value of this expression will never change during
+     the current function, even though it is not manifestly constant.
+     1 in a MEM if contents of memory are constant.  This does not
+     necessarily mean that the value of this expression is constant.
      1 in a SUBREG if it is from a promoted variable that is unsigned.
      1 in a SYMBOL_REF if it addresses something in the per-function
      constants pool.
@@ -148,7 +149,9 @@ typedef struct rtx_def
      together with the preceding insn.  Valid only within sched.
      1 in an INSN, JUMP_INSN, or CALL_INSN if insn is in a delay slot and
      from the target of a branch.  Valid from reorg until end of compilation;
-     cleared before used.  */
+     cleared before used.
+     1 in an INSN if this insn is dead code.  Valid only during
+     dead-code elimination phase; cleared before use. */
   unsigned int in_struct : 1;
   /* 1 if this rtx is used.  This is used for copying shared structure.
      See `unshare_all_rtl'.
@@ -159,30 +162,34 @@ typedef struct rtx_def
   unsigned int used : 1;
   /* Nonzero if this rtx came from procedure integration.
      In a REG, nonzero means this reg refers to the return value
-     of the current function.  */
+     of the current function.
+     1 in a SYMBOL_REF if the symbol is weak.  */
   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.
      1 in a MEM if the MEM refers to a scalar, rather than a member of
-     an aggregate.  */
+     an aggregate.
+     1 in a REG if the register is a pointer.
+     1 in a SYMBOL_REF if it addresses something in the per-function
+     constant string pool.  */
   unsigned frame_related : 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.  */
   rtunion fld[1];
-} *rtx;
+};
 
 #define NULL_RTX (rtx) 0
 
 /* Define macros to access the `code' field of the rtx.  */
 
-#define GET_CODE(RTX)          ((RTX)->code)
-#define PUT_CODE(RTX, CODE)    ((RTX)->code = (CODE))
+#define GET_CODE(RTX)      ((enum rtx_code) (RTX)->code)
+#define PUT_CODE(RTX, CODE) ((RTX)->code = (ENUM_BITFIELD(rtx_code)) (CODE))
 
-#define GET_MODE(RTX)          ((RTX)->mode)
-#define PUT_MODE(RTX, MODE)    ((RTX)->mode = (MODE))
+#define GET_MODE(RTX)      ((enum machine_mode) (RTX)->mode)
+#define PUT_MODE(RTX, MODE) ((RTX)->mode = (ENUM_BITFIELD(machine_mode)) (MODE))
 
 #define RTX_INTEGRATED_P(RTX) ((RTX)->integrated)
 #define RTX_UNCHANGING_P(RTX) ((RTX)->unchanging)
@@ -192,20 +199,36 @@ typedef struct rtx_def
    for a variable number of things.  The principle use is inside
    PARALLEL expressions.  */
 
-typedef struct rtvec_def{
+struct rtvec_def {
   int num_elem;                /* number of elements */
-  struct rtx_def *elem[1];
-} *rtvec;
+  rtx elem[1];
+};
 
 #define NULL_RTVEC (rtvec) 0
 
 #define GET_NUM_ELEM(RTVEC)            ((RTVEC)->num_elem)
 #define PUT_NUM_ELEM(RTVEC, NUM)       ((RTVEC)->num_elem = (NUM))
 
-/* 1 if X is a REG.  */
-
+/* Predicate yielding nonzero iff X is an rtl for a register.  */
 #define REG_P(X) (GET_CODE (X) == REG)
 
+/* Predicate yielding nonzero iff X is a label insn.  */
+#define LABEL_P(X) (GET_CODE (X) == CODE_LABEL)
+
+/* Predicate yielding nonzero iff X is a jump insn.  */
+#define JUMP_P(X) (GET_CODE (X) == JUMP_INSN)
+
+/* Predicate yielding nonzero iff X is a note insn.  */
+#define NOTE_P(X) (GET_CODE (X) == NOTE)
+
+/* Predicate yielding nonzero iff X is a barrier insn.  */
+#define BARRIER_P(X) (GET_CODE (X) == BARRIER)
+
+/* Predicate yielding nonzero iff X is a data for a jump table.  */
+#define JUMP_TABLE_DATA_P(INSN) \
+  (JUMP_P (INSN) && (GET_CODE (PATTERN (INSN)) == ADDR_VEC || \
+                    GET_CODE (PATTERN (INSN)) == ADDR_DIFF_VEC))
+
 /* 1 if X is a constant value that is an integer.  */
 
 #define CONSTANT_P(X)   \
@@ -223,45 +246,40 @@ typedef struct rtvec_def{
 (*({ rtx _rtx = (RTX); int _n = (N);                                   \
      enum rtx_code _code = GET_CODE (_rtx);                            \
      if (_n < 0 || _n >= GET_RTX_LENGTH (_code))                       \
-       rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__,          \
-                               __PRETTY_FUNCTION__);                   \
+       rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__, __FUNCTION__); \
      if (GET_RTX_FORMAT(_code)[_n] != C1)                              \
-       rtl_check_failed_type1 (_rtx, _n, C1, __FILE__, __LINE__,       \
-                              __PRETTY_FUNCTION__);                    \
+       rtl_check_failed_type1(_rtx, _n, C1, __FILE__, __LINE__, __FUNCTION__); \
      &_rtx->fld[_n]; }))
 
 #define RTL_CHECK2(RTX, N, C1, C2) __extension__                       \
 (*({ rtx _rtx = (RTX); int _n = (N);                                   \
      enum rtx_code _code = GET_CODE (_rtx);                            \
      if (_n < 0 || _n >= GET_RTX_LENGTH (_code))                       \
-       rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__,          \
-                               __PRETTY_FUNCTION__);                   \
+       rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__, __FUNCTION__); \
      if (GET_RTX_FORMAT(_code)[_n] != C1                               \
         && GET_RTX_FORMAT(_code)[_n] != C2)                            \
        rtl_check_failed_type2 (_rtx, _n, C1, C2, __FILE__, __LINE__,   \
-                              __PRETTY_FUNCTION__);                    \
+                              __FUNCTION__);                           \
      &_rtx->fld[_n]; }))
 
 #define RTL_CHECKC1(RTX, N, C) __extension__                           \
 (*({ rtx _rtx = (RTX); int _n = (N);                                   \
      if (GET_CODE (_rtx) != C)                                         \
-       rtl_check_failed_code1 (_rtx, C, __FILE__, __LINE__,            \
-                              __PRETTY_FUNCTION__);                    \
+       rtl_check_failed_code1 (_rtx, C, __FILE__, __LINE__, __FUNCTION__); \
      &_rtx->fld[_n]; }))
 
 #define RTL_CHECKC2(RTX, N, C1, C2) __extension__                      \
 (*({ rtx _rtx = (RTX); int _n = (N);                                   \
      enum rtx_code _code = GET_CODE (_rtx);                            \
      if (_code != C1 && _code != C2)                                   \
-       rtl_check_failed_code2 (_rtx, C1, C2, __FILE__, __LINE__,       \
-                              __PRETTY_FUNCTION__);                    \
+       rtl_check_failed_code2(_rtx, C1, C2, __FILE__, __LINE__, __FUNCTION__); \
      &_rtx->fld[_n]; }))
 
 #define RTVEC_ELT(RTVEC, I) __extension__                              \
 (*({ rtvec _rtvec = (RTVEC); int _i = (I);                             \
      if (_i < 0 || _i >= GET_NUM_ELEM (_rtvec))                                \
        rtvec_check_failed_bounds (_rtvec, _i, __FILE__, __LINE__,      \
-                                 __PRETTY_FUNCTION__);                 \
+                                 __FUNCTION__);                        \
      &_rtvec->elem[_i]; }))
 
 extern void rtl_check_failed_bounds PARAMS ((rtx, int,
@@ -302,6 +320,7 @@ extern void rtvec_check_failed_bounds PARAMS ((rtvec, int,
 #define XBITMAP(RTX, N) (RTL_CHECK1(RTX, N, 'b').rtbit)
 #define XTREE(RTX, N)   (RTL_CHECK1(RTX, N, 't').rttree)
 #define XBBDEF(RTX, N) (RTL_CHECK1(RTX, N, 'B').bb)
+#define XTMPL(RTX, N)  (RTL_CHECK1(RTX, N, 'T').rtstr)
 
 #define XVECEXP(RTX, N, M)     RTVEC_ELT (XVEC (RTX, N), M)
 #define XVECLEN(RTX, N)                GET_NUM_ELEM (XVEC (RTX, N))
@@ -311,6 +330,7 @@ extern void rtvec_check_failed_bounds PARAMS ((rtvec, int,
 
 #define X0WINT(RTX, N)    (RTL_CHECK1(RTX, N, '0').rtwint)
 #define X0INT(RTX, N)     (RTL_CHECK1(RTX, N, '0').rtint)
+#define X0UINT(RTX, N)    (RTL_CHECK1(RTX, N, '0').rtuint)
 #define X0STR(RTX, N)     (RTL_CHECK1(RTX, N, '0').rtstr)
 #define X0EXP(RTX, N)     (RTL_CHECK1(RTX, N, '0').rtx)
 #define X0VEC(RTX, N)     (RTL_CHECK1(RTX, N, '0').rtvec)
@@ -369,8 +389,8 @@ extern void rtvec_check_failed_bounds PARAMS ((rtvec, int,
 /* 1 if insn has been deleted.  */
 #define INSN_DELETED_P(INSN) ((INSN)->volatil)
 
-/* 1 if insn is a call to a const function.  */
-#define CONST_CALL_P(INSN) ((INSN)->unchanging)
+/* 1 if insn is a call to a const or pure function.  */
+#define CONST_OR_PURE_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)
@@ -379,6 +399,9 @@ extern void rtvec_check_failed_bounds PARAMS ((rtvec, int,
    delay slots, i.e., it is an annulled branch.   */
 #define INSN_ANNULLED_BRANCH_P(INSN) ((INSN)->unchanging)
 
+/* 1 if insn is a dead code.  Valid only for dead-code elimination phase. */
+#define INSN_DEAD_CODE_P(INSN) ((INSN)->in_struct)
+
 /* 1 if insn is in a delay slot and is from the target of the branch.  If
    the branch insn has INSN_ANNULLED_BRANCH_P set, this insn should only be
    executed if the branch is taken.  For annulled branches with this bit
@@ -475,10 +498,10 @@ enum reg_note
      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 is attached to JUMP_INSNs and CALL_INSNs.
+     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
@@ -494,8 +517,10 @@ enum reg_note
      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 is attached to JUMP_INSNs and CALL_INSNSs.  It contains
+     CONCAT of two integer value.  First specifies the branch predictor
+     that added the note, second specifies the predicted hitrate of branch
+     in the same format as REG_BR_PROB note uses.  */
   REG_BR_PRED,
 
   /* Attached to insns that are RTX_FRAME_RELATED_P, but are too complex
@@ -514,13 +539,28 @@ enum reg_note
      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
+  REG_SAVE_NOTE,
+
+  /* Indicates that this insn (which is part of the prologue) computes
+     a value which might not be used later, and if so it's OK to delete
+     the insn.  Normally, deleting any insn in the prologue is an error. 
+     At present the parameter is unused and set to (const_int 0).  */
+  REG_MAYBE_DEAD,
+
+  /* Indicates that a call does not return.  */
+  REG_NORETURN,
+
+  /* Indicates that an indirect jump is a non-local goto instead of a 
+     computed goto.  */
+  REG_NON_LOCAL_GOTO,
+
+  /* This kind of note is generated at each to `setjmp',
+     and similar functions that can return twice.  */
+  REG_SETJMP,
+
+  /* Indicate calls that always returns.  */
+  REG_ALWAYS_RETURN
 };
 
 /* The base value for branch probability notes.  */
@@ -570,6 +610,11 @@ extern const char * const reg_note_name[];
    Other kinds of NOTEs are identified by negative numbers here.  */
 #define NOTE_LINE_NUMBER(INSN) XCINT(INSN, 4, NOTE)
 
+/* Nonzero if INSN is a note marking the beginning of a basic block.  */
+#define NOTE_INSN_BASIC_BLOCK_P(INSN)                  \
+  (GET_CODE (INSN) == NOTE                             \
+   && NOTE_LINE_NUMBER (INSN) == NOTE_INSN_BASIC_BLOCK)
+
 /* Codes that appear in the NOTE_LINE_NUMBER field
    for kinds of notes that are not line numbers.
 
@@ -613,10 +658,6 @@ enum insn_note
      off the end of the function body without a return statement.  */
   NOTE_INSN_FUNCTION_END,
 
-  /* This kind of note is generated just after each call to `setjmp',
-     and similar functions that can return twice.  */
-  NOTE_INSN_SETJMP,
-
   /* This marks the point immediately after the last prologue insn.  */
   NOTE_INSN_PROLOGUE_END,
 
@@ -663,7 +704,7 @@ enum insn_note
 
 extern const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS];
 #define GET_NOTE_INSN_NAME(NOTE_CODE) \
-  (note_insn_name[(NOTE_CODE) - NOTE_INSN_BIAS])
+  (note_insn_name[(NOTE_CODE) - (int) NOTE_INSN_BIAS])
 
 /* The name of a label, in case it corresponds to an explicit label
    in the input source code.  */
@@ -704,9 +745,12 @@ extern const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS];
 
 #define CONTAINING_INSN(RTX) XCEXP(RTX, 2, LABEL_REF)
 
-/* For a REG rtx, REGNO extracts the register number.  */
+/* For a REG rtx, REGNO extracts the register number.  ORIGINAL_REGNO holds
+   the number the register originally had; for a pseudo register turned into
+   a hard reg this will hold the old pseudo register number.  */
 
 #define REGNO(RTX) XCUINT(RTX, 0, REG)
+#define ORIGINAL_REGNO(RTX) X0UINT(RTX, 1)
 
 /* For a REG rtx, REG_FUNCTION_VALUE_P is nonzero if the reg
    is the current function's return value.  */
@@ -716,15 +760,48 @@ extern const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS];
 /* 1 in a REG rtx if it corresponds to a variable declared by the user.  */
 #define REG_USERVAR_P(RTX) ((RTX)->volatil)
 
+/* 1 in a REG rtx if the register is a pointer.  */
+#define REG_POINTER(RTX) ((RTX)->frame_related)
+
+/* 1 if the given register REG corresponds to a hard register.  */
+#define HARD_REGISTER_P(REG) (HARD_REGISTER_NUM_P (REGNO (REG)))
+
+/* 1 if the given register number REG_NO corresponds to a hard register.  */
+#define HARD_REGISTER_NUM_P(REG_NO) (REG_NO < FIRST_PSEUDO_REGISTER)
+
 /* For a CONST_INT rtx, INTVAL extracts the integer.  */
 
 #define INTVAL(RTX) XCWINT(RTX, 0, CONST_INT)
 
+/* For a CONST_DOUBLE:
+   The usual two ints that hold the value.
+   For a DImode, that is all there are;
+    and CONST_DOUBLE_LOW is the low-order word and ..._HIGH the high-order.
+   For a float, the number of ints varies,
+    and CONST_DOUBLE_LOW is the one that should come first *in memory*.
+    So use &CONST_DOUBLE_LOW(r) as the address of an array of ints.  */
+#define CONST_DOUBLE_LOW(r) XCWINT (r, 2, CONST_DOUBLE)
+#define CONST_DOUBLE_HIGH(r) XCWINT (r, 3, CONST_DOUBLE)
+
+/* Link for chain of all CONST_DOUBLEs in use in current function.  */
+#define CONST_DOUBLE_CHAIN(r) XCEXP (r, 1, CONST_DOUBLE)
+/* The MEM which represents this CONST_DOUBLE's value in memory,
+   or const0_rtx if no MEM has been made for it yet,
+   or cc0_rtx if it is not on the chain.  */
+#define CONST_DOUBLE_MEM(r) XCEXP (r, 0, CONST_DOUBLE)
+
 /* For a SUBREG rtx, SUBREG_REG extracts the value we want a subreg of.
-   SUBREG_WORD extracts the word-number.  */
+   SUBREG_BYTE extracts the byte-number.  */
 
 #define SUBREG_REG(RTX) XCEXP(RTX, 0, SUBREG)
-#define SUBREG_WORD(RTX) XCUINT(RTX, 1, SUBREG)
+#define SUBREG_BYTE(RTX) XCUINT(RTX, 1, SUBREG)
+
+/* in rtlanal.c */
+extern unsigned int subreg_regno_offset        PARAMS ((unsigned int, 
+                                                        enum machine_mode, 
+                                                        unsigned int, 
+                                                        enum machine_mode));
+extern unsigned int subreg_regno       PARAMS ((rtx));
 
 /* 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
@@ -746,8 +823,12 @@ extern const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS];
 #define ASM_OPERANDS_INPUT_CONSTRAINT_VEC(RTX) XCVEC ((RTX), 4, ASM_OPERANDS)
 #define ASM_OPERANDS_INPUT(RTX, N) XCVECEXP ((RTX), 3, (N), ASM_OPERANDS)
 #define ASM_OPERANDS_INPUT_LENGTH(RTX) XCVECLEN ((RTX), 3, ASM_OPERANDS)
-#define ASM_OPERANDS_INPUT_CONSTRAINT(RTX, N) XSTR (XCVECEXP ((RTX), 4, (N), ASM_OPERANDS), 0)
-#define ASM_OPERANDS_INPUT_MODE(RTX, N) GET_MODE (XCVECEXP ((RTX), 4, (N), ASM_OPERANDS))
+#define ASM_OPERANDS_INPUT_CONSTRAINT_EXP(RTX, N) \
+                       XCVECEXP ((RTX), 4, (N), ASM_OPERANDS)
+#define ASM_OPERANDS_INPUT_CONSTRAINT(RTX, N) \
+                       XSTR (XCVECEXP ((RTX), 4, (N), ASM_OPERANDS), 0)
+#define ASM_OPERANDS_INPUT_MODE(RTX, N)  \
+                       GET_MODE (XCVECEXP ((RTX), 4, (N), ASM_OPERANDS))
 #define ASM_OPERANDS_SOURCE_FILE(RTX) XCSTR ((RTX), 5, ASM_OPERANDS)
 #define ASM_OPERANDS_SOURCE_LINE(RTX) XCINT ((RTX), 6, ASM_OPERANDS)
 
@@ -755,22 +836,15 @@ extern const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS];
    Also in an ASM_OPERANDS rtx.  */
 #define MEM_VOLATILE_P(RTX) ((RTX)->volatil)
 
-/* For a MEM rtx, 1 if it refers to a field of an aggregate.  If zero,
-   RTX may or may not refer to a field of an aggregate.  */
+/* For a MEM rtx, 1 if it refers to an aggregate, either to the
+   aggregate itself of to a field of the aggregate.  If zero, RTX may
+   or may not be such a reference.  */
 #define MEM_IN_STRUCT_P(RTX) ((RTX)->in_struct)
 
 /* For a MEM rtx, 1 if it refers to a scalar.  If zero, RTX may or may
    not refer to a scalar.*/
 #define MEM_SCALAR_P(RTX) ((RTX)->frame_related)
 
-/* Copy the attributes that apply to memory locations from RHS to LHS.  */
-#define MEM_COPY_ATTRIBUTES(LHS, RHS)                  \
-  (MEM_VOLATILE_P (LHS) = MEM_VOLATILE_P (RHS),                \
-   MEM_IN_STRUCT_P (LHS) = MEM_IN_STRUCT_P (RHS),      \
-   MEM_SCALAR_P (LHS) = MEM_SCALAR_P (RHS),            \
-   MEM_ALIAS_SET (LHS) = MEM_ALIAS_SET (RHS),          \
-   RTX_UNCHANGING_P (LHS) = RTX_UNCHANGING_P (RHS))
-
 /* If VAL is non-zero, set MEM_IN_STRUCT_P and clear MEM_SCALAR_P in
    RTX.  Otherwise, vice versa.  Use this macro only when you are
    *sure* that you know that the MEM is in a structure, or is a
@@ -797,7 +871,15 @@ extern const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS];
    some front-ends, these numbers may correspond in some way to types,
    or other language-level entities, but they need not, and the
    back-end makes no such assumptions.  */
-#define MEM_ALIAS_SET(RTX) XCINT(RTX, 1, MEM)
+#define MEM_ALIAS_SET(RTX) XCWINT(RTX, 1, MEM)
+
+/* Copy the attributes that apply to memory locations from RHS to LHS.  */
+#define MEM_COPY_ATTRIBUTES(LHS, RHS)                  \
+  (MEM_VOLATILE_P (LHS) = MEM_VOLATILE_P (RHS),                \
+   MEM_IN_STRUCT_P (LHS) = MEM_IN_STRUCT_P (RHS),      \
+   MEM_SCALAR_P (LHS) = MEM_SCALAR_P (RHS),            \
+   MEM_ALIAS_SET (LHS) = MEM_ALIAS_SET (RHS),          \
+   RTX_UNCHANGING_P (LHS) = RTX_UNCHANGING_P (RHS))
 
 /* For a LABEL_REF, 1 means that this reference is to a label outside the
    loop containing the reference.  */
@@ -845,16 +927,18 @@ extern const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS];
 /* 1 in a SYMBOL_REF if it addresses this function's constants pool.  */
 #define CONSTANT_POOL_ADDRESS_P(RTX) ((RTX)->unchanging)
 
+/* 1 in a SYMBOL_REF if it addresses this function's string constant pool.  */
+#define STRING_POOL_ADDRESS_P(RTX) ((RTX)->frame_related)
+
 /* Flag in a SYMBOL_REF for machine-specific purposes.  */
 #define SYMBOL_REF_FLAG(RTX) ((RTX)->volatil)
 
-/* 1 in a SYMBOL_REF if it represents a symbol which might have to change
-   if its inlined or unrolled. */
-#define SYMBOL_REF_NEED_ADJUST(RTX)  ((RTX)->in_struct)
-
 /* 1 means a SYMBOL_REF has been the library function in emit_library_call.  */
 #define SYMBOL_REF_USED(RTX) ((RTX)->used)
 
+/* 1 means a SYMBOL_REF is weak.  */
+#define SYMBOL_REF_WEAK(RTX) ((RTX)->integrated)
+
 /* Define a macro to look for REG_INC notes,
    but save time on machines where they never exist.  */
 
@@ -889,6 +973,22 @@ extern const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS];
 #define HAVE_POST_DECREMENT 0
 #endif
 
+#ifndef HAVE_POST_MODIFY_DISP
+#define HAVE_POST_MODIFY_DISP 0
+#endif
+
+#ifndef HAVE_POST_MODIFY_REG
+#define HAVE_POST_MODIFY_REG 0
+#endif
+
+#ifndef HAVE_PRE_MODIFY_DISP
+#define HAVE_PRE_MODIFY_DISP 0
+#endif
+
+#ifndef HAVE_PRE_MODIFY_REG
+#define HAVE_PRE_MODIFY_REG 0
+#endif
+
 
 /* Some architectures do not have complete pre/post increment/decrement
    instruction sets, or only move some modes efficiently.  These macros
@@ -1032,26 +1132,18 @@ extern const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS];
    This is 1 until after the rtl generation pass.  */
 extern int rtx_equal_function_value_matters;
 
-/* Generally useful functions.  */
-
-/* The following functions accept a wide integer argument.  Rather than
-   having to cast on every function call, we use a macro instead, that is
-   defined here and in tree.h.  */
+/* Nonzero when we are generating CONCATs.  */
+extern int generating_concat_p;
 
-#ifndef exact_log2
-#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             PARAMS ((unsigned HOST_WIDE_INT));
-extern int floor_log2_wide             PARAMS ((unsigned HOST_WIDE_INT));
+/* Generally useful functions.  */
 
 /* In expmed.c */
 extern int ceil_log2                   PARAMS ((unsigned HOST_WIDE_INT));
 
 #define plus_constant(X,C) plus_constant_wide (X, (HOST_WIDE_INT) (C))
 
-#define plus_constant_for_output(X,C)  \
-  plus_constant_for_output_wide (X, (HOST_WIDE_INT) (C))
+/* In builtins.c */
+extern rtx expand_builtin_expect_jump  PARAMS ((tree, rtx, rtx));
 
 /* In explow.c */
 extern void set_stack_check_libfunc PARAMS ((rtx));
@@ -1061,38 +1153,58 @@ 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));
 
+/* In emit-rtl.c */
 extern rtx gen_rtx                     PARAMS ((enum rtx_code,
                                                 enum machine_mode, ...));
 extern rtvec gen_rtvec                 PARAMS ((int, ...));
+extern rtx copy_insn_1                 PARAMS ((rtx));
+extern rtx copy_insn                   PARAMS ((rtx));
 
-extern char *oballoc                   PARAMS ((int));
-extern char *permalloc                 PARAMS ((int));
+/* In rtl.c */
 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));
+
+/* In emit-rtl.c */
 extern rtx copy_rtx_if_shared          PARAMS ((rtx));
+
+/* In rtl.c */
 extern rtx copy_most_rtx               PARAMS ((rtx, rtx));
 extern rtx shallow_copy_rtx            PARAMS ((rtx));
 extern int rtx_equal_p                  PARAMS ((rtx, rtx));
+
+/* In emit-rtl.c */
 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 int subreg_hard_regno           PARAMS ((rtx, int));
 extern rtx gen_lowpart_common          PARAMS ((enum machine_mode, rtx));
 extern rtx gen_lowpart                 PARAMS ((enum machine_mode, rtx));
+
+/* In cse.c */
 extern rtx gen_lowpart_if_possible     PARAMS ((enum machine_mode, rtx));
+
+/* In emit-rtl.c */
 extern rtx gen_highpart                        PARAMS ((enum machine_mode, rtx));
+extern rtx gen_highpart_mode           PARAMS ((enum machine_mode,
+                                                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 constant_subword            PARAMS ((rtx, int,
+                                                enum machine_mode));
+
+/* In emit-rtl.c */
 extern rtx operand_subword_force       PARAMS ((rtx, unsigned int,
                                                 enum machine_mode));
 extern int subreg_lowpart_p            PARAMS ((rtx));
+extern unsigned int subreg_lowpart_offset PARAMS ((enum machine_mode,
+                                                  enum machine_mode));
+extern unsigned int subreg_highpart_offset PARAMS ((enum machine_mode,
+                                                   enum machine_mode));
 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));
@@ -1103,24 +1215,26 @@ 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));
+
+/* In varasm.c  */
 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));
+
+/* In varasm.c  */
 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));
+
+/* In function.c  */
 extern rtx assign_stack_local          PARAMS ((enum machine_mode,
                                               HOST_WIDE_INT, int));
 extern rtx assign_stack_temp           PARAMS ((enum machine_mode,
                                               HOST_WIDE_INT, int));
-extern rtx assign_temp                 PARAMS ((union tree_node *,
-                                              int, int, int));
-extern rtx protect_from_queue          PARAMS ((rtx, int));
-extern void emit_queue                 PARAMS ((void));
-extern rtx emit_move_insn              PARAMS ((rtx, rtx));
+extern rtx assign_temp                 PARAMS ((tree, int, int, int));
+/* In emit-rtl.c */
 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));
@@ -1158,77 +1272,138 @@ 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));
+
+/* In jump.c */
 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 void mark_jump_label            PARAMS ((rtx, rtx, int));
+extern void cleanup_barriers           PARAMS ((void));
+
+/* In jump.c */
+extern void 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));
+
+/* In recog.c  */
+extern rtx *find_constant_term_loc     PARAMS ((rtx *));
+
+/* In emit-rtl.c  */
 extern rtx try_split                   PARAMS ((rtx, rtx, int));
+extern int split_branch_probability;
+
+/* In unknown file  */
 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));
+
+/* In simplify-rtx.c  */
+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_gen_unary          PARAMS ((enum rtx_code,
+                                                enum machine_mode, rtx,
+                                                enum machine_mode));
+extern rtx simplify_gen_ternary                PARAMS ((enum rtx_code,
+                                                enum machine_mode,
+                                                enum machine_mode,
+                                                rtx, rtx, rtx));
+extern rtx simplify_gen_relational     PARAMS ((enum rtx_code,
+                                                enum machine_mode,
+                                                enum machine_mode,
+                                                rtx, rtx));
+extern rtx simplify_subreg             PARAMS ((enum machine_mode,
+                                                rtx,
+                                                enum machine_mode,
+                                                unsigned int));
+extern rtx simplify_gen_subreg         PARAMS ((enum machine_mode,
+                                                rtx,
+                                                enum machine_mode,
+                                                unsigned int));
+extern rtx simplify_replace_rtx                PARAMS ((rtx, 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 rtx avoid_constant_pool_reference PARAMS ((rtx));
+
+/* In function.c  */
+extern rtx gen_mem_addressof           PARAMS ((rtx, tree));
+
+/* In regclass.c  */
 extern enum machine_mode choose_hard_reg_mode PARAMS ((unsigned int,
                                                       unsigned int));
+
+/* In emit-rtl.c  */
 extern void set_unique_reg_note         PARAMS ((rtx, enum reg_note, rtx));
 
 /* Functions in rtlanal.c */
 
+/* Single set is implemented as macro for performance reasons.  */
+#define single_set(I) (INSN_P (I) \
+                      ? (GET_CODE (PATTERN (I)) == SET \
+                         ? PATTERN (I) : single_set_1 (I)) \
+                      : NULL_RTX)
+#define single_set_1(I) single_set_2 (I, PATTERN (I))
+
+extern int rtx_addr_can_trap_p         PARAMS ((rtx));
 extern int rtx_unstable_p              PARAMS ((rtx));
-extern int rtx_varies_p                        PARAMS ((rtx));
-extern int rtx_addr_varies_p           PARAMS ((rtx));
+extern int rtx_varies_p                        PARAMS ((rtx, int));
+extern int rtx_addr_varies_p           PARAMS ((rtx, int));
 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 count_occurrences           PARAMS ((rtx, rtx, int));
 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 commutative_operand_precedence PARAMS ((rtx));
+extern int swap_commutative_operands_p PARAMS ((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 insn_dependant_p            PARAMS ((rtx, rtx));
+extern int insn_dependent_p            PARAMS ((rtx, rtx));
 extern int reg_set_p                   PARAMS ((rtx, rtx));
-extern rtx single_set                  PARAMS ((rtx));
+extern rtx single_set_2                        PARAMS ((rtx, rtx));
 extern int multiple_sets               PARAMS ((rtx));
+extern int set_noop_p                  PARAMS ((rtx));
+extern int noop_move_p                 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 rtx set_of                      PARAMS ((rtx, rtx));
 extern void note_stores                        PARAMS ((rtx,
                                                 void (*) (rtx, rtx, void *),
                                                 void *));
+extern void note_uses                  PARAMS ((rtx *,
+                                                void (*) (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 rtx find_reg_equal_equiv_note   PARAMS ((rtx));
 extern int find_reg_fusage             PARAMS ((rtx, enum rtx_code, rtx));
 extern int find_regno_fusage           PARAMS ((rtx, enum rtx_code,
                                                 unsigned int));
@@ -1249,6 +1424,7 @@ 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 *));
 extern int loc_mentioned_in_p          PARAMS ((rtx *, rtx));
+extern rtx find_first_parameter_load   PARAMS ((rtx, rtx));
 
 /* flow.c */
 
@@ -1285,6 +1461,7 @@ extern enum reg_class reg_alternate_class PARAMS ((int));
 extern rtx get_first_nonparm_insn      PARAMS ((void));
 
 extern void split_all_insns            PARAMS ((int));
+extern void split_all_insns_noflow     PARAMS ((void));
 
 #define MAX_SAVED_CONST_INT 64
 extern rtx const_int_rtx[MAX_SAVED_CONST_INT * 2 + 1];
@@ -1387,9 +1564,13 @@ extern rtx return_address_pointer_rtx;
 extern rtx gen_rtx_CONST_DOUBLE PARAMS ((enum machine_mode, rtx,
                                       HOST_WIDE_INT, HOST_WIDE_INT));
 extern rtx gen_rtx_CONST_INT PARAMS ((enum machine_mode, HOST_WIDE_INT));
+extern rtx gen_raw_REG PARAMS ((enum machine_mode, int));
 extern rtx gen_rtx_REG PARAMS ((enum machine_mode, int));
+extern rtx gen_rtx_SUBREG PARAMS ((enum machine_mode, rtx, int));
 extern rtx gen_rtx_MEM PARAMS ((enum machine_mode, rtx));
 
+extern rtx gen_lowpart_SUBREG 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))
@@ -1446,12 +1627,13 @@ extern rtx gen_rtx_MEM PARAMS ((enum machine_mode, rtx));
 
 #define LAST_VIRTUAL_REGISTER          ((FIRST_VIRTUAL_REGISTER) + 4)
 
+/* REGNUM never really appearing in the INSN stream.  */
+#define INVALID_REGNUM                 (~(unsigned int)0)
+
 extern rtx find_next_ref               PARAMS ((rtx, rtx));
-extern rtx *find_single_use            PARAMS ((rtx, rtx, 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));
+extern rtx output_constant_def         PARAMS ((tree, int));
+extern rtx immed_real_const            PARAMS ((tree));
 
 /* Define a default value for STORE_FLAG_VALUE.  */
 
@@ -1492,17 +1674,24 @@ extern int no_new_pseudos;
 extern int rtx_to_tree_code    PARAMS ((enum rtx_code));
 
 /* In tree.c */
-extern void obfree                     PARAMS ((char *));
 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 *));
+
 /* In cse.c */
 struct cse_basic_block_data;
+
+/* Return the right cost to give to an operation
+   to make the cost of the corresponding register-to-register instruction
+   N times that of a fast register-to-register instruction.  */
+#define COSTS_N_INSNS(N) ((N) * 4)
+
+/* Maximum cost of a rtl expression.  This value has the special meaning
+   not to use an rtx with this cost under any circumstances.  */
+#define MAX_COST INT_MAX
+
 extern int rtx_cost                    PARAMS ((rtx, enum rtx_code));
 extern int address_cost                        PARAMS ((rtx, enum machine_mode));
-extern void delete_trivially_dead_insns        PARAMS ((rtx, int));
+extern void delete_trivially_dead_insns        PARAMS ((rtx, int, int));
 #ifdef BUFSIZ
 extern int cse_main                    PARAMS ((rtx, int, int, FILE *));
 #endif
@@ -1521,6 +1710,7 @@ 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 only_sets_cc0_p             PARAMS ((rtx));
 extern int sets_cc0_p                  PARAMS ((rtx));
 extern int invert_jump_1               PARAMS ((rtx, rtx));
 extern int invert_jump                 PARAMS ((rtx, rtx, int));
@@ -1528,21 +1718,18 @@ extern int rtx_renumbered_equal_p       PARAMS ((rtx, rtx));
 extern int true_regnum                 PARAMS ((rtx));
 extern int redirect_jump_1             PARAMS ((rtx, rtx));
 extern int redirect_jump               PARAMS ((rtx, rtx, int));
-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 rtx_equal_for_thread_p      PARAMS ((rtx, rtx, rtx));
 extern int can_reverse_comparison_p    PARAMS ((rtx, rtx));
+extern enum rtx_code reversed_comparison_code PARAMS ((rtx, rtx));
+extern enum rtx_code reversed_comparison_code_parts PARAMS ((enum rtx_code,
+                                                            rtx, 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_CROSS_JUMP_DEATH_MATTERS  2
-#define JUMP_NOOP_MOVES                        1
-#define JUMP_AFTER_REGSCAN             1
+extern void purge_line_number_notes    PARAMS ((rtx));
+extern void copy_loop_headers          PARAMS ((rtx));
 
 /* In emit-rtl.c. */
 extern int max_reg_num                         PARAMS ((void));
@@ -1585,9 +1772,6 @@ void restore_line_number_status PARAMS ((int old_value));
 extern void renumber_insns                      PARAMS ((FILE *));
 extern void remove_unnecessary_notes             PARAMS ((void));
 
-/* In insn-emit.c */
-extern void add_clobbers               PARAMS ((rtx, int));
-
 /* In combine.c */
 extern int combine_instructions                PARAMS ((rtx, unsigned int));
 extern unsigned int extended_count     PARAMS ((rtx, enum machine_mode, int));
@@ -1600,16 +1784,19 @@ extern void dump_combine_total_stats    PARAMS ((FILE *));
 /* In sched.c. */
 #ifdef BUFSIZ
 extern void schedule_insns             PARAMS ((FILE *));
+extern void schedule_ebbs              PARAMS ((FILE *));
 #endif
 extern void fix_sched_param            PARAMS ((const char *, const char *));
 
 /* In print-rtl.c */
+extern const char *print_rtx_head;
 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));
+extern void print_simple_rtl           PARAMS ((FILE *, rtx));
 extern int print_rtl_single            PARAMS ((FILE *, rtx));
 extern void print_inline_rtx           PARAMS ((FILE *, rtx, int));
 #endif
@@ -1627,15 +1814,11 @@ 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            PARAMS ((rtx, rtx));
-extern int safe_from_earlyclobber      PARAMS ((rtx, rtx));
+extern void purge_hard_subreg_sets                     PARAMS ((rtx));
 
 /* In stmt.c */
 extern void set_file_and_line_for_stmt PARAMS ((const char *, int));
@@ -1644,12 +1827,11 @@ extern void emit_jump                   PARAMS ((rtx));
 extern int preserve_subexpressions_p   PARAMS ((void));
 
 /* In expr.c */
-extern void init_expr_once             PARAMS ((void));
-extern void move_by_pieces             PARAMS ((rtx, rtx, int, unsigned int));
+extern void move_by_pieces             PARAMS ((rtx, rtx,
+                                                unsigned HOST_WIDE_INT,
+                                                unsigned int));
 
 /* In flow.c */
-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 print_rtl_with_bb          PARAMS ((FILE *, rtx));
@@ -1706,9 +1888,6 @@ extern void combine_stack_adjustments     PARAMS ((void));
 extern void dbr_schedule               PARAMS ((rtx, FILE *));
 #endif
 
-/* In optabs.c */
-extern void init_optabs                        PARAMS ((void));
-
 /* In local-alloc.c */
 #ifdef BUFSIZ
 extern void dump_local_alloc           PARAMS ((FILE *));
@@ -1716,17 +1895,6 @@ extern void dump_local_alloc             PARAMS ((FILE *));
 extern int local_alloc                 PARAMS ((void));
 extern int function_invariant_p                PARAMS ((rtx));
 
-/* In reload1.c */
-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                      PARAMS ((rtx, int, FILE *));
-#endif
-
-/* In caller-save.c */
-extern void init_caller_save           PARAMS ((void));
-
 /* In profile.c */
 extern void init_branch_prob           PARAMS ((const char *));
 extern void branch_prob                        PARAMS ((void));
@@ -1769,24 +1937,37 @@ extern void rrotate_double      PARAMS ((unsigned HOST_WIDE_INT, HOST_WIDE_INT,
                                         HOST_WIDE_INT *));
 
 /* In calls.c */
-extern void emit_library_call          PARAMS ((rtx, int, enum machine_mode,
-                                                 int, ...));
-extern rtx emit_library_call_value     PARAMS ((rtx, rtx, int,
-                                                enum machine_mode,
-                                                int, ...));
+enum libcall_type
+{
+  LCT_NORMAL = 0,
+  LCT_CONST = 1,
+  LCT_PURE = 2,
+  LCT_CONST_MAKE_BLOCK = 3,
+  LCT_PURE_MAKE_BLOCK = 4,
+  LCT_NORETURN = 5,
+  LCT_THROW = 6,
+  LCT_ALWAYS_RETURN = 7
+};
+
+extern void emit_library_call          PARAMS ((rtx, enum libcall_type,
+                                                enum machine_mode, int,
+                                                ...));
+extern rtx emit_library_call_value     PARAMS ((rtx, rtx, enum libcall_type,
+                                                enum machine_mode, int,
+                                                ...));
 
 /* In unroll.c */
 extern int set_dominates_use           PARAMS ((int, int, int, rtx, rtx));
 
 /* In varasm.c */
-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                   PARAMS ((void));
-extern void rtx_free                   PARAMS ((rtx));
+extern void traverse_md_constants      PARAMS ((int (*) (void **, void *),
+                                                void *));
+struct md_constant { char *name, *value; };
 
 #ifdef BUFSIZ
 extern int read_skip_spaces            PARAMS ((FILE *));
@@ -1804,16 +1985,16 @@ extern int read_rtx_lineno;
 
 extern void fancy_abort PARAMS ((const char *, int, const char *))
     ATTRIBUTE_NORETURN;
-#if (GCC_VERSION >= 2007)
-#define abort() fancy_abort (__FILE__, __LINE__, __PRETTY_FUNCTION__)
-#else
-#define abort() fancy_abort (__FILE__, __LINE__, 0)
-#endif
+#define abort() fancy_abort (__FILE__, __LINE__, __FUNCTION__)
 
 /* In alias.c */
+extern void clear_reg_alias_info       PARAMS ((rtx));
 extern rtx canon_rtx                    PARAMS ((rtx));
 extern int true_dependence             PARAMS ((rtx, enum machine_mode, rtx,
-                                               int (*)(rtx)));
+                                               int (*)(rtx, int)));
+extern rtx get_addr                     PARAMS ((rtx));
+extern int canon_true_dependence        PARAMS ((rtx, enum machine_mode, rtx,
+                                                rtx, int (*)(rtx, int)));
 extern int read_dependence             PARAMS ((rtx, rtx));
 extern int anti_dependence             PARAMS ((rtx, rtx));
 extern int output_dependence           PARAMS ((rtx, rtx));
@@ -1821,10 +2002,8 @@ 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 ((unsigned int, rtx, int));
-extern void record_alias_subset         PARAMS ((int, int));
 extern rtx addr_side_effect_eval       PARAMS ((rtx, int, int));
+extern void set_mem_alias_set          PARAMS ((rtx, HOST_WIDE_INT));
 
 /* In sibcall.c */
 typedef enum {
@@ -1846,7 +2025,10 @@ extern rtx stack_limit_rtx;
 /* In regrename.c */
 extern void regrename_optimize         PARAMS ((void));
 
-/* In condexec.c */
+/* In ifcvt.c */
 extern void if_convert                 PARAMS ((int));
 
-#endif /* _RTL_H */
+/* In predict.c */
+extern void invert_br_probabilities    PARAMS ((rtx));
+extern bool expensive_function_p       PARAMS ((int));
+#endif /* ! GCC_RTL_H */