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;
#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 */
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;
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
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 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))
/* 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)
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
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
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,
/* 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. */
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,
#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));
extern rtx gen_rtx PARAMS ((enum rtx_code,
enum machine_mode, ...));
extern rtvec gen_rtvec PARAMS ((int, ...));
-
-/* In other files */
-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 */
/* 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,
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 get_insns PARAMS ((void));
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 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 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));
+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));
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));
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 avoid_constant_pool_reference PARAMS ((rtx));
/* In function.c */
-extern rtx gen_mem_addressof PARAMS ((rtx, union tree_node *));
+extern rtx gen_mem_addressof PARAMS ((rtx, tree));
/* In regclass.c */
extern enum machine_mode choose_hard_reg_mode PARAMS ((unsigned int,
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 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 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 */
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];
extern rtx find_next_ref PARAMS ((rtx, rtx));
-extern rtx output_constant_def PARAMS ((union tree_node *, int));
-extern rtx immed_real_const PARAMS ((union tree_node *));
+extern rtx output_constant_def PARAMS ((tree, int));
+extern rtx immed_real_const PARAMS ((tree));
/* Define a default value for STORE_FLAG_VALUE. */
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
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));
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 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));
LCT_CONST_MAKE_BLOCK = 3,
LCT_PURE_MAKE_BLOCK = 4,
LCT_NORETURN = 5,
- LCT_THROW = 6
+ LCT_THROW = 6,
+ LCT_ALWAYS_RETURN = 7
};
extern void emit_library_call PARAMS ((rtx, enum libcall_type,
#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 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 {
/* 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 */