summaryrefslogtreecommitdiffstats
path: root/contrib/gcc/rtl.h
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/gcc/rtl.h')
-rw-r--r--contrib/gcc/rtl.h302
1 files changed, 191 insertions, 111 deletions
diff --git a/contrib/gcc/rtl.h b/contrib/gcc/rtl.h
index 4aa25b2..8eba5ea 100644
--- a/contrib/gcc/rtl.h
+++ b/contrib/gcc/rtl.h
@@ -1,5 +1,5 @@
/* Register Transfer Language (RTL) definitions for GNU C-Compiler
- Copyright (C) 1987, 91-97, 1998 Free Software Foundation, Inc.
+ Copyright (C) 1987, 91-98, 1999 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -91,6 +91,7 @@ typedef union rtunion_def
addr_diff_vec_flags rt_addr_diff_vec_flags;
struct bitmap_head_def *rtbit;
union tree_node *rttree;
+ struct basic_block_def *bb;
} rtunion;
/* RTL expression ("rtx"). */
@@ -113,10 +114,9 @@ typedef struct rtx_def
#else
enum machine_mode mode : 8;
#endif
- /* 1 in an INSN if it can alter flow of control
- within this function. Not yet used! */
+ /* LINK_COST_ZERO in an INSN_LIST. */
unsigned int jump : 1;
- /* 1 in an INSN if it can call another function. Not yet used! */
+ /* 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
@@ -163,9 +163,11 @@ typedef struct rtx_def
In a REG, nonzero means this reg refers to the return value
of the current function. */
unsigned integrated : 1;
- /* Nonzero 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 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. */
unsigned frame_related : 1;
/* The first element of the operands of this rtx.
The number of operands and their types are controlled
@@ -173,8 +175,6 @@ typedef struct rtx_def
rtunion fld[1];
} *rtx;
-#include "gansidecl.h"
-
#define NULL_RTX (rtx) 0
/* Define macros to access the `code' field of the rtx. */
@@ -338,8 +338,20 @@ typedef struct rtvec_def{
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. */
-
+ 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 what that a call is actually a
+ call to rethrow, and specifies which region the rethrow is targetting.
+ This provides a way to generate the non standard flow edges required
+ for a rethrow. */
+
#define REG_NOTES(INSN) ((INSN)->fld[6].rtx)
@@ -352,7 +364,9 @@ enum reg_note { REG_DEAD = 1, REG_INC = 2, REG_EQUIV = 3, REG_WAS_0 = 4,
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_BR_PRED = 20, REG_EH_CONTEXT = 21,
+ REG_FRAME_RELATED_EXPR = 22, REG_EH_REGION = 23,
+ REG_EH_RETHROW = 24 };
/* The base value for branch probability notes. */
#define REG_BR_PROB_BASE 10000
@@ -392,6 +406,7 @@ extern char *reg_note_name[];
#define NOTE_BLOCK_NUMBER(INSN) ((INSN)->fld[3].rtint)
#define NOTE_RANGE_INFO(INSN) ((INSN)->fld[3].rtx)
#define NOTE_LIVE_INFO(INSN) ((INSN)->fld[3].rtx)
+#define NOTE_BASIC_BLOCK(INSN) ((INSN)->fld[3].bb)
/* If the NOTE_BLOCK_NUMBER field gets a -1, it means create a new
block node for a live range block. */
@@ -457,6 +472,8 @@ extern char *reg_note_name[];
#define NOTE_INSN_RANGE_END -18
/* Record which registers are currently live. */
#define NOTE_INSN_LIVE -19
+/* Record the struct for the following basic block. */
+#define NOTE_INSN_BASIC_BLOCK -20
#if 0 /* These are not used, and I don't know what they were for. --rms. */
#define NOTE_DECL_NAME(INSN) ((INSN)->fld[3].rtstr)
@@ -559,9 +576,29 @@ extern char *note_insn_name[];
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. */
+/* 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. */
#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 MEM_VOLATILE_P, MEM_IN_STRUCT_P, and MEM_SCALAR_P
+ attributes 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))
+
+/* 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
+ scalar. VAL is evaluated only once. */
+#define MEM_SET_IN_STRUCT_P(RTX, VAL) \
+ ((VAL) ? (MEM_IN_STRUCT_P (RTX) = 1, MEM_SCALAR_P (RTX) = 0) \
+ : (MEM_IN_STRUCT_P (RTX) = 0, MEM_SCALAR_P (RTX) = 1))
+
/* For a MEM rtx, the alias set. If 0, this MEM is not in any alias
set, and may alias anything. Otherwise, the MEM can only alias
MEMs in the same alias set. This value is set in a
@@ -616,6 +653,10 @@ extern char *note_insn_name[];
/* 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)
@@ -679,6 +720,7 @@ extern char *note_insn_name[];
#define FUNCTION_FLAGS_USES_CONST_POOL 0200
#define FUNCTION_FLAGS_CALLS_LONGJMP 0400
#define FUNCTION_FLAGS_USES_PIC_OFFSET_TABLE 01000
+#define FUNCTION_FLAGS_HAS_COMPUTED_JUMP 02000
/* Define a macro to look for REG_INC notes,
but save time on machines where they never exist. */
@@ -698,6 +740,60 @@ extern char *note_insn_name[];
#define AUTO_INC_DEC
#endif
+#ifndef HAVE_PRE_INCREMENT
+#define HAVE_PRE_INCREMENT 0
+#endif
+
+#ifndef HAVE_PRE_DECREMENT
+#define HAVE_PRE_DECREMENT 0
+#endif
+
+#ifndef HAVE_POST_INCREMENT
+#define HAVE_POST_INCREMENT 0
+#endif
+
+#ifndef HAVE_POST_DECREMENT
+#define HAVE_POST_DECREMENT 0
+#endif
+
+
+/* Some architectures do not have complete pre/post increment/decrement
+ instruction sets, or only move some modes efficiently. These macros
+ allow us to tune autoincrement generation. */
+
+#ifndef USE_LOAD_POST_INCREMENT
+#define USE_LOAD_POST_INCREMENT(MODE) HAVE_POST_INCREMENT
+#endif
+
+#ifndef USE_LOAD_POST_DECREMENT
+#define USE_LOAD_POST_DECREMENT(MODE) HAVE_POST_DECREMENT
+#endif
+
+#ifndef USE_LOAD_PRE_INCREMENT
+#define USE_LOAD_PRE_INCREMENT(MODE) HAVE_PRE_INCREMENT
+#endif
+
+#ifndef USE_LOAD_PRE_DECREMENT
+#define USE_LOAD_PRE_DECREMENT(MODE) HAVE_PRE_DECREMENT
+#endif
+
+#ifndef USE_STORE_POST_INCREMENT
+#define USE_STORE_POST_INCREMENT(MODE) HAVE_POST_INCREMENT
+#endif
+
+#ifndef USE_STORE_POST_DECREMENT
+#define USE_STORE_POST_DECREMENT(MODE) HAVE_POST_DECREMENT
+#endif
+
+#ifndef USE_STORE_PRE_INCREMENT
+#define USE_STORE_PRE_INCREMENT(MODE) HAVE_PRE_INCREMENT
+#endif
+
+#ifndef USE_STORE_PRE_DECREMENT
+#define USE_STORE_PRE_DECREMENT(MODE) HAVE_PRE_DECREMENT
+#endif
+
+
/* Accessors for RANGE_INFO. */
/* For RANGE_{START,END} notes return the RANGE_START note. */
#define RANGE_INFO_NOTE_START(INSN) (XEXP (INSN, 0))
@@ -825,19 +921,6 @@ extern rtvec gen_rtvec PVPROTO((int, ...));
extern rtx read_rtx PROTO((FILE *));
#endif
-#if 0
-/* At present, don't prototype xrealloc, since all of the callers don't
- cast their pointers to char *, and all of the xrealloc's don't use
- void * yet. */
-extern char *xmalloc PROTO((size_t));
-extern char *xcalloc PROTO((size_t, size_t));
-extern char *xrealloc PROTO((void *, size_t));
-#else
-extern char *xmalloc ();
-extern char *xcalloc ();
-extern char *xrealloc ();
-#endif
-
extern char *oballoc PROTO((int));
extern char *permalloc PROTO((int));
extern rtx rtx_alloc PROTO((RTX_CODE));
@@ -845,6 +928,7 @@ extern rtvec rtvec_alloc PROTO((int));
extern rtx copy_rtx PROTO((rtx));
extern rtx copy_rtx_if_shared PROTO((rtx));
extern rtx copy_most_rtx PROTO((rtx, rtx));
+extern rtx shallow_copy_rtx PROTO((rtx));
extern rtvec gen_rtvec_v PROTO((int, rtx *));
extern rtvec gen_rtvec_vv PROTO((int, rtunion *));
extern rtx gen_reg_rtx PROTO((enum machine_mode));
@@ -892,6 +976,7 @@ extern rtx emit_insn_before PROTO((rtx, rtx));
extern rtx emit_jump_insn_before PROTO((rtx, rtx));
extern rtx emit_call_insn_before PROTO((rtx, rtx));
extern rtx emit_barrier_before PROTO((rtx));
+extern rtx emit_label_before PROTO((rtx, rtx));
extern rtx emit_note_before PROTO((int, rtx));
extern rtx emit_insn_after PROTO((rtx, rtx));
extern rtx emit_jump_insn_after PROTO((rtx, rtx));
@@ -942,7 +1027,6 @@ extern rtx simplify_unary_operation PROTO((enum rtx_code, enum machine_mode, rtx
extern rtx simplify_binary_operation PROTO((enum rtx_code, enum machine_mode, rtx, rtx));
extern rtx simplify_ternary_operation PROTO((enum rtx_code, enum machine_mode, enum machine_mode, rtx, rtx, rtx));
extern rtx simplify_relational_operation PROTO((enum rtx_code, enum machine_mode, rtx, rtx));
-extern rtx nonlocal_label_rtx_list PROTO((void));
extern rtx gen_move_insn PROTO((rtx, rtx));
extern rtx gen_jump PROTO((rtx));
extern rtx gen_beq PROTO((rtx));
@@ -952,14 +1036,7 @@ extern rtx gen_mem_addressof PROTO((rtx, union tree_node *));
extern rtx eliminate_constant_term PROTO((rtx, rtx *));
extern rtx expand_complex_abs PROTO((enum machine_mode, rtx, rtx, int));
extern enum machine_mode choose_hard_reg_mode PROTO((int, int));
-extern int rtx_varies_p PROTO((rtx));
-extern int may_trap_p PROTO((rtx));
-extern int side_effects_p PROTO((rtx));
-extern int volatile_refs_p PROTO((rtx));
-extern int volatile_insn_p PROTO((rtx));
-extern void remove_note PROTO((rtx, rtx));
-extern int refers_to_regno_p PROTO((int, int, rtx, rtx *));
-extern int reg_overlap_mentioned_p PROTO((rtx, rtx));
+extern void set_unique_reg_note PROTO((rtx, enum reg_note, rtx));
/* Functions in rtlanal.c */
@@ -973,16 +1050,18 @@ extern int reg_referenced_p PROTO((rtx, rtx));
extern int reg_used_between_p PROTO((rtx, rtx, rtx));
extern int reg_referenced_between_p PROTO((rtx, rtx, rtx));
extern int reg_set_between_p PROTO((rtx, rtx, rtx));
+extern int regs_set_between_p PROTO((rtx, rtx, rtx));
extern int modified_between_p PROTO((rtx, rtx, rtx));
extern int no_labels_between_p PROTO((rtx, rtx));
+extern int no_jumps_between_p PROTO((rtx, rtx));
extern int modified_in_p PROTO((rtx, rtx));
extern int reg_set_p PROTO((rtx, rtx));
extern rtx single_set PROTO((rtx));
-extern rtx find_last_value PROTO((rtx, rtx *, rtx));
+extern int multiple_sets PROTO((rtx));
+extern rtx find_last_value PROTO((rtx, rtx *, rtx, int));
extern int refers_to_regno_p PROTO((int, int, rtx, rtx *));
extern int reg_overlap_mentioned_p PROTO((rtx, rtx));
-extern rtx find_use_as_address PROTO((rtx, rtx, HOST_WIDE_INT));
-extern void note_stores PROTO((rtx, void (*)()));
+extern void note_stores PROTO((rtx, void (*)(rtx, rtx)));
extern rtx reg_set_last PROTO((rtx, rtx));
extern int rtx_equal_p PROTO((rtx, rtx));
extern int dead_or_set_p PROTO((rtx, rtx));
@@ -996,10 +1075,21 @@ extern int side_effects_p PROTO((rtx));
extern int volatile_refs_p PROTO((rtx));
extern int volatile_insn_p PROTO((rtx));
extern int may_trap_p PROTO((rtx));
-extern int inequality_comparison_p PROTO((rtx));
+extern int inequality_comparisons_p PROTO ((rtx));
extern rtx replace_rtx PROTO((rtx, rtx, rtx));
extern rtx replace_regs PROTO((rtx, rtx *, int, int));
extern int computed_jump_p PROTO((rtx));
+typedef int (*rtx_function) PROTO((rtx *, void *));
+extern int for_each_rtx PROTO((rtx *, rtx_function, void *));
+extern rtx regno_use_in PROTO((int, rtx));
+extern int auto_inc_p PROTO((rtx));
+extern void remove_node_from_expr_list PROTO((rtx, rtx *));
+
+/* flow.c */
+
+extern rtx find_use_as_address PROTO((rtx, rtx, HOST_WIDE_INT));
+
+/* regclass.c */
/* Maximum number of parallel sets and clobbers in any insn in this fn.
Always at least 3, since the combiner could put that many togetherm
@@ -1007,14 +1097,23 @@ extern int computed_jump_p PROTO((rtx));
extern int max_parallel;
+/* Free up register info memory. */
+extern void free_reg_info PROTO((void));
+
+/* recog.c */
extern int asm_noperands PROTO((rtx));
-extern char *decode_asm_operands PROTO((rtx, rtx *, rtx **, char **, enum machine_mode *));
+extern char *decode_asm_operands PROTO((rtx, rtx *, rtx **,
+ const char **,
+ enum machine_mode *));
extern enum reg_class reg_preferred_class PROTO((int));
extern enum reg_class reg_alternate_class PROTO((int));
extern rtx get_first_nonparm_insn PROTO((void));
+extern void split_block_insns PROTO((int, int));
+extern void update_flow_info PROTO((rtx, rtx, rtx, rtx));
+
/* Standard pieces of rtx, to be substituted directly into things. */
#define pc_rtx (&global_rtl.pc_val)
#define cc0_rtx (&global_rtl.cc0_val)
@@ -1050,6 +1149,7 @@ extern struct _global_rtl
struct rtx_def virtual_stack_vars_val;
struct rtx_def virtual_stack_dynamic_val;
struct rtx_def virtual_outgoing_args_val;
+ struct rtx_def virtual_cfa_val;
} global_rtl;
/* All references to certain hard regs, except those created
@@ -1063,7 +1163,7 @@ extern rtx struct_value_rtx;
extern rtx struct_value_incoming_rtx;
extern rtx static_chain_rtx;
extern rtx static_chain_incoming_rtx;
-
+extern rtx return_address_pointer_rtx;
/* Include the RTL generation functions. */
@@ -1076,6 +1176,8 @@ extern rtx static_chain_incoming_rtx;
add to this list, modify special_rtx in gengenrtl.c as well. You
should also modify gen_rtx to use the special function. */
+extern rtx gen_rtx_CONST_DOUBLE PROTO((enum machine_mode, rtx,
+ HOST_WIDE_INT, HOST_WIDE_INT));
extern rtx gen_rtx_CONST_INT PROTO((enum machine_mode, HOST_WIDE_INT));
extern rtx gen_rtx_REG PROTO((enum machine_mode, int));
extern rtx gen_rtx_MEM PROTO((enum machine_mode, rtx));
@@ -1154,7 +1256,17 @@ extern rtx gen_rtx_MEM PROTO((enum machine_mode, rtx));
#define VIRTUAL_OUTGOING_ARGS_REGNUM ((FIRST_VIRTUAL_REGISTER) + 3)
-#define LAST_VIRTUAL_REGISTER ((FIRST_VIRTUAL_REGISTER) + 3)
+/* This points to the Canonical Frame Address of the function. This
+ should corrospond to the CFA produced by INCOMING_FRAME_SP_OFFSET,
+ but is calculated relative to the arg pointer for simplicity; the
+ frame pointer nor stack pointer are necessarily fixed relative to
+ the CFA until after reload. */
+
+#define virtual_cfa_rtx (&global_rtl.virtual_cfa_val)
+
+#define VIRTUAL_CFA_REGNUM ((FIRST_VIRTUAL_REGISTER) + 4)
+
+#define LAST_VIRTUAL_REGISTER ((FIRST_VIRTUAL_REGISTER) + 4)
extern rtx find_next_ref PROTO((rtx, rtx));
extern rtx *find_single_use PROTO((rtx, rtx, rtx *));
@@ -1163,18 +1275,18 @@ extern rtx output_constant_def PROTO((union tree_node *));
extern rtx immed_real_const PROTO((union tree_node *));
extern union tree_node *make_tree PROTO((union tree_node *, rtx));
-/* Abort routines */
-extern void fatal_insn_not_found PROTO((rtx));
-extern void fatal_insn PROTO((char *, rtx));
-
/* Define a default value for STORE_FLAG_VALUE. */
#ifndef STORE_FLAG_VALUE
#define STORE_FLAG_VALUE 1
#endif
+/* Nonzero after the second flow pass has completed.
+ Set to 1 or 0 by toplev.c */
+extern int flow2_completed;
+
/* Nonzero after end of reload pass.
- Set to 1 or 0 by toplev.c. */
+ Set to 1 or 0 by reload1.c. */
extern int reload_completed;
@@ -1191,6 +1303,10 @@ extern int reload_in_progress;
the same indirect address eventually. */
extern int cse_not_expected;
+/* Set to nonzero before life analysis to indicate that it is unsafe to
+ generate any new pseudo registers. */
+extern int no_new_pseudos;
+
/* Indexed by pseudo register number, gives the rtx for that pseudo.
Allocated in parallel with regno_pointer_flag. */
extern rtx *regno_reg_rtx;
@@ -1206,24 +1322,6 @@ extern char *regno_pointer_align;
extern int rtx_to_tree_code PROTO((enum rtx_code));
-/* In rtlanal.c */
-extern int reg_set_p PROTO ((rtx, rtx));
-extern int reg_mentioned_p PROTO ((rtx, rtx));
-extern int reg_referenced_p PROTO ((rtx, rtx));
-extern int reg_used_between_p PROTO ((rtx, rtx, rtx));
-extern int reg_set_p PROTO ((rtx, rtx));
-extern int reg_referenced_between_p PROTO ((rtx, rtx, rtx));
-extern int reg_set_between_p PROTO ((rtx, rtx, rtx));
-extern int rtx_unstable_p PROTO ((rtx));
-extern int rtx_addr_varies_p PROTO ((rtx));
-extern int rtx_equal_p PROTO ((rtx, rtx));
-extern int inequality_comparisons_p PROTO ((rtx));
-extern int dead_or_set_p PROTO ((rtx, rtx));
-extern int dead_or_set_regno_p PROTO ((rtx, int));
-extern int no_labels_between_p PROTO ((rtx, rtx));
-extern int modified_between_p PROTO ((rtx, rtx, rtx));
-extern int modified_in_p PROTO ((rtx, rtx));
-
/* In tree.c */
extern void obfree PROTO ((char *));
struct obstack;
@@ -1249,13 +1347,16 @@ extern void cse_end_of_basic_block PROTO ((rtx,
/* In jump.c */
extern int comparison_dominates_p PROTO ((enum rtx_code, enum rtx_code));
extern int condjump_p PROTO ((rtx));
+extern rtx condjump_label PROTO ((rtx));
extern int simplejump_p PROTO ((rtx));
+extern int returnjump_p PROTO ((rtx));
extern int sets_cc0_p PROTO ((rtx));
extern int invert_jump PROTO ((rtx, rtx));
extern int rtx_renumbered_equal_p PROTO ((rtx, rtx));
extern int true_regnum PROTO ((rtx));
extern int redirect_jump PROTO ((rtx, rtx));
extern void jump_optimize PROTO ((rtx, int, int, int));
+extern void rebuild_jump_labels PROTO ((rtx));
extern void thread_jumps PROTO ((rtx, int, int));
extern int redirect_exp PROTO ((rtx *, rtx, rtx, rtx));
extern int rtx_equal_for_thread_p PROTO ((rtx, rtx, rtx));
@@ -1295,9 +1396,11 @@ extern void link_cc0_insns PROTO ((rtx));
extern void add_insn PROTO ((rtx));
extern void add_insn_before PROTO ((rtx, rtx));
extern void add_insn_after PROTO ((rtx, rtx));
+extern void remove_insn PROTO ((rtx));
extern void reorder_insns_with_line_notes PROTO ((rtx, rtx, rtx));
extern void emit_insn_after_with_line_notes PROTO ((rtx, rtx, rtx));
extern enum rtx_code classify_insn PROTO ((rtx));
+extern void init_virtual_regs PROTO ((void));
extern rtx emit PROTO ((rtx));
/* Query and clear/ restore no_line_numbers. This is used by the
switch / case handling in stmt.c to give proper line numbers in
@@ -1331,14 +1434,15 @@ extern void debug_rtx_list PROTO ((rtx, int));
extern rtx debug_rtx_find PROTO ((rtx, int));
#ifdef BUFSIZ
extern void print_rtl PROTO ((FILE *, rtx));
-extern void print_rtl_single PROTO ((FILE *, rtx));
+extern int print_rtl_single PROTO ((FILE *, rtx));
extern void print_inline_rtx PROTO ((FILE *, rtx, int));
#endif
/* In loop.c */
extern void init_loop PROTO ((void));
+extern rtx libcall_other_reg PROTO ((rtx, rtx));
#ifdef BUFSIZ
-extern void loop_optimize PROTO ((rtx, FILE *, int));
+extern void loop_optimize PROTO ((rtx, FILE *, int, int));
#endif
extern void record_excess_regs PROTO ((rtx, rtx, rtx *));
@@ -1356,53 +1460,20 @@ extern void purge_addressof PROTO ((rtx));
/* In reload.c */
extern int operands_match_p PROTO ((rtx, rtx));
extern int safe_from_earlyclobber PROTO ((rtx, rtx));
-extern int strict_memory_address_p PROTO ((enum machine_mode, rtx));
-
-/* In recog.c */
-extern int memory_address_p PROTO ((enum machine_mode, rtx));
-extern int constrain_operands PROTO ((int, int));
-extern int mode_dependent_address_p PROTO ((rtx));
-extern void init_recog_no_volatile PROTO ((void));
-extern int offsettable_memref_p PROTO ((rtx));
-extern int offsettable_nonstrict_memref_p PROTO ((rtx));
-extern int reg_fits_class_p PROTO ((rtx, register enum reg_class,
- int, enum machine_mode));
-extern int check_asm_operands PROTO ((rtx));
-extern int address_operand PROTO ((rtx, enum machine_mode));
-extern int const_int_operand PROTO ((rtx, enum machine_mode));
-extern int const_double_operand PROTO ((rtx, enum machine_mode));
-extern int general_operand PROTO ((rtx, enum machine_mode));
-extern int immediate_operand PROTO ((rtx, enum machine_mode));
-extern int nonimmediate_operand PROTO ((rtx, enum machine_mode));
-extern int memory_operand PROTO ((rtx, enum machine_mode));
-extern int nonmemory_operand PROTO ((rtx, enum machine_mode));
-extern int push_operand PROTO ((rtx, enum machine_mode));
-extern int register_operand PROTO ((rtx, enum machine_mode));
-extern int scratch_operand PROTO ((rtx, enum machine_mode));
-extern int indirect_operand PROTO ((rtx, enum machine_mode));
-extern int mode_independent_operand PROTO ((rtx, enum machine_mode));
-extern int comparison_operator PROTO ((rtx, enum machine_mode));
-extern void init_recog_no_volatile PROTO ((void));
-extern void init_recog PROTO ((void));
-extern int validate_replace_rtx PROTO ((rtx, rtx, rtx));
-extern int offsettable_address_p PROTO ((int, enum machine_mode, rtx));
-extern int next_insn_tests_no_inequality PROTO ((rtx));
-extern int recog_memoized PROTO ((rtx));
-extern int validate_change PROTO ((rtx, rtx *, rtx, int));
-extern int apply_change_group PROTO ((void));
-extern void cancel_changes PROTO ((int));
-extern int num_validated_changes PROTO ((void));
-
-/* In insn-recog.c */
-extern int recog PROTO ((rtx, rtx, int *));
/* In stmt.c */
extern void expand_null_return PROTO((void));
extern void emit_jump PROTO ((rtx));
extern int preserve_subexpressions_p PROTO ((void));
+/* List (chain of EXPR_LIST) of labels heading the current handlers for
+ nonlocal gotos. */
+extern rtx nonlocal_goto_handler_labels;
+
/* In expr.c */
extern void init_expr_once PROTO ((void));
+extern void move_by_pieces PROTO ((rtx, rtx, int, int));
+
/* In stupid.c */
#ifdef BUFSIZ
@@ -1410,11 +1481,13 @@ extern void stupid_life_analysis PROTO ((rtx, int, FILE *));
#endif
/* In flow.c */
-extern void allocate_for_life_analysis PROTO ((void));
-extern void recompute_reg_usage PROTO ((rtx));
+extern void allocate_bb_life_data PROTO ((void));
+extern void allocate_reg_life_data PROTO ((void));
+extern void recompute_reg_usage PROTO ((rtx, int));
#ifdef BUFSIZ
extern void dump_flow_info PROTO ((FILE *));
#endif
+extern void free_bb_mem PROTO ((void));
/* In expmed.c */
extern void init_expmed PROTO ((void));
@@ -1426,7 +1499,7 @@ extern rtx expand_mult_highpart PROTO ((enum machine_mode, rtx,
/* In gcse.c */
#ifdef BUFSIZ
-extern void gcse_main PROTO ((rtx, FILE *));
+extern int gcse_main PROTO ((rtx, FILE *));
#endif
/* In global.c */
@@ -1469,7 +1542,8 @@ extern void init_optabs PROTO ((void));
#ifdef BUFSIZ
extern void dump_local_alloc PROTO ((FILE *));
#endif
-extern void local_alloc PROTO ((void));
+extern int local_alloc PROTO ((void));
+extern int function_invariant_p PROTO ((rtx));
/* In reload1.c */
extern void reload_cse_regs PROTO ((rtx));
@@ -1483,7 +1557,7 @@ extern int reload PROTO ((rtx, int, FILE *));
extern void init_caller_save PROTO ((void));
/* In profile.c */
-extern void init_branch_prob PROTO ((char *));
+extern void init_branch_prob PROTO ((const char *));
#ifdef BUFSIZ
extern void branch_prob PROTO ((rtx, FILE *));
extern void end_branch_prob PROTO ((FILE *));
@@ -1549,5 +1623,11 @@ extern void init_alias_analysis PROTO ((void));
extern void end_alias_analysis PROTO ((void));
extern void record_base_value PROTO ((int, rtx, int));
+extern void record_alias_subset PROTO ((int, int));
+extern rtx addr_side_effect_eval PROTO ((rtx, int, int));
+
+#ifdef STACK_REGS
+extern int stack_regs_mentioned PROTO((rtx insn));
+#endif
#endif /* _RTL_H */
OpenPOWER on IntegriCloud