OSDN Git Service

Fix for PR 3783.
[pf3gnuchains/gcc-fork.git] / gcc / rtl.h
index 9db7a37..d993888 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2,25 +2,25 @@
    Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
    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;
@@ -162,7 +162,8 @@ 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
@@ -178,17 +179,17 @@ typedef struct rtx_def
      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)
@@ -198,10 +199,10 @@ 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
 
@@ -319,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))
@@ -387,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)
@@ -496,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
@@ -515,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
@@ -535,11 +539,6 @@ 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,
 
@@ -554,7 +553,14 @@ enum reg_note
 
   /* Indicates that an indirect jump is a non-local goto instead of a 
      computed goto.  */
-  REG_NON_LOCAL_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.  */
@@ -652,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,
 
@@ -702,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.  */
@@ -789,10 +791,17 @@ extern const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS];
 #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
@@ -924,13 +933,12 @@ extern const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS];
 /* 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.  */
 
@@ -1129,24 +1137,13 @@ extern int generating_concat_p;
 
 /* 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.  */
-
-#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));
-
 /* 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));
@@ -1160,15 +1157,12 @@ extern void optimize_save_area_alloca   PARAMS ((rtx));
 extern rtx gen_rtx                     PARAMS ((enum rtx_code,
                                                 enum machine_mode, ...));
 extern rtvec gen_rtvec                 PARAMS ((int, ...));
-
-/* In other files */
-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));
 
 /* In rtl.c */
+extern rtx rtx_alloc                   PARAMS ((RTX_CODE));
+extern rtvec rtvec_alloc               PARAMS ((int));
 extern rtx copy_rtx                    PARAMS ((rtx));
 
 /* In emit-rtl.c */
@@ -1183,6 +1177,7 @@ 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 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));
 
@@ -1191,18 +1186,25 @@ 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));
@@ -1218,9 +1220,6 @@ 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));
 
-/* In explow.c  */
-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));
@@ -1234,13 +1233,7 @@ 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));
-/* In expr.c  */
-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));
@@ -1287,13 +1280,11 @@ 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 void mark_jump_label            PARAMS ((rtx, rtx, int, int));
-
-/* In reload.c */
-extern rtx find_equiv_reg              PARAMS ((rtx, rtx, enum reg_class, int, short *, int, enum machine_mode));
+extern void mark_jump_label            PARAMS ((rtx, rtx, int));
+extern void cleanup_barriers           PARAMS ((void));
 
 /* In jump.c */
-extern rtx squeeze_notes               PARAMS ((rtx, rtx));
+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));
@@ -1302,40 +1293,57 @@ extern rtx get_label_after              PARAMS ((rtx));
 extern rtx follow_jumps                        PARAMS ((rtx));
 
 /* In recog.c  */
-extern rtx adj_offsettable_operand     PARAMS ((rtx, int));
+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));
 
 /* 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_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));
-
-/* In optabs.c  */
-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 avoid_constant_pool_reference PARAMS ((rtx));
 
 /* In function.c  */
-extern rtx gen_mem_addressof           PARAMS ((rtx, union tree_node *));
-
-/* In explow.c  */
-extern rtx eliminate_constant_term     PARAMS ((rtx, rtx *));
-
-/* In optabs.c */
-extern rtx expand_complex_abs          PARAMS ((enum machine_mode, rtx, rtx,
-                                                int));
+extern rtx gen_mem_addressof           PARAMS ((rtx, tree));
 
 /* In regclass.c  */
 extern enum machine_mode choose_hard_reg_mode PARAMS ((unsigned int,
@@ -1366,6 +1374,8 @@ 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));
@@ -1374,6 +1384,8 @@ extern int insn_dependent_p               PARAMS ((rtx, rtx));
 extern int reg_set_p                   PARAMS ((rtx, 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 *));
@@ -1382,12 +1394,16 @@ 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));
@@ -1408,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 */
 
@@ -1444,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];
@@ -1548,8 +1566,11 @@ extern rtx gen_rtx_CONST_DOUBLE PARAMS ((enum machine_mode, rtx,
 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))
@@ -1606,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 *, int));
-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.  */
 
@@ -1669,7 +1691,7 @@ struct cse_basic_block_data;
 
 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
@@ -1688,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));
@@ -1695,8 +1718,6 @@ 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));
@@ -1707,12 +1728,8 @@ extern enum rtx_code reversed_comparison_code_parts PARAMS ((enum rtx_code,
 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));
@@ -1755,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));
@@ -1800,17 +1814,12 @@ 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));
 extern void purge_hard_subreg_sets                     PARAMS ((rtx));
 
-/* In reload.c */
-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 PARAMS ((const char *, int));
 extern void expand_null_return         PARAMS ((void));
@@ -1818,7 +1827,6 @@ 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,
                                                 unsigned HOST_WIDE_INT,
                                                 unsigned int));
@@ -1880,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 *));
@@ -1890,15 +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));
-extern int reload                      PARAMS ((rtx, int));
-
-/* 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));
@@ -1947,7 +1943,10 @@ enum libcall_type
   LCT_CONST = 1,
   LCT_PURE = 2,
   LCT_CONST_MAKE_BLOCK = 3,
-  LCT_PURE_MAKE_BLOCK = 4
+  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,
@@ -1961,9 +1960,7 @@ extern rtx emit_library_call_value        PARAMS ((rtx, rtx, enum libcall_type,
 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 */
@@ -1991,9 +1988,13 @@ extern void fancy_abort PARAMS ((const char *, int, const char *))
 #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)));
+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));
@@ -2002,6 +2003,7 @@ extern void init_alias_once               PARAMS ((void));
 extern void init_alias_analysis                PARAMS ((void));
 extern void end_alias_analysis         PARAMS ((void));
 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 {
@@ -2023,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 */