/* Nonzero if this rtx came from procedure integration.
1 in a REG or PARALLEL means this rtx refers to the return value
of the current function.
- 1 in a SYMBOL_REF if the symbol is weak. */
+ 1 in a SYMBOL_REF if the symbol is weak.
+ 1 in a MEM if the MEM refers to a scalar, rather than a member of
+ an aggregate. */
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.
- 1 in a REG if the register is a pointer.
+ 1 in a REG or MEM if it is a pointer.
1 in a SYMBOL_REF if it addresses something in the per-function
constant string pool. */
unsigned frame_related : 1;
computed goto. */
REG_NON_LOCAL_GOTO,
+ /* Indicates that a jump crosses between hot and cold sections
+ in a (partitioned) assembly or .o file, and therefore should not be
+ reduced to a simpler jump by optimizations. */
+ REG_CROSSING_JUMP,
+
/* This kind of note is generated at each to `setjmp',
and similar functions that can return twice. */
REG_SETJMP,
/* Record a prediction. Uses NOTE_PREDICTION. */
NOTE_INSN_PREDICTION,
+ /* Record that the current basic block is unlikely to be executed and
+ should be moved to the UNLIKELY_EXECUTED_TEXT_SECTION. */
+ NOTE_INSN_UNLIKELY_EXECUTED_CODE,
+
/* The location of a variable. */
NOTE_INSN_VAR_LOCATION,
#define REG_POINTER(RTX) \
(RTL_FLAG_CHECK1("REG_POINTER", (RTX), REG)->frame_related)
+/* 1 if RTX is a mem that holds a pointer value. */
+#define MEM_POINTER(RTX) \
+ (RTL_FLAG_CHECK1("MEM_POINTER", (RTX), MEM)->frame_related)
+
/* 1 if the given register REG corresponds to a hard register. */
#define HARD_REGISTER_P(REG) (HARD_REGISTER_NUM_P (REGNO (REG)))
#define SUBREG_BYTE(RTX) XCUINT (RTX, 1, SUBREG)
/* in rtlanal.c */
+/* 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 an 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 (rtx, enum rtx_code);
+extern int address_cost (rtx, enum machine_mode);
extern unsigned int subreg_lsb (rtx);
extern unsigned int subreg_lsb_1 (enum machine_mode, enum machine_mode,
unsigned int);
/* 1 if RTX is a mem that refers to a scalar. If zero, RTX may or may
not refer to a scalar. */
#define MEM_SCALAR_P(RTX) \
- (RTL_FLAG_CHECK1("MEM_SCALAR_P", (RTX), MEM)->frame_related)
+ (RTL_FLAG_CHECK1("MEM_SCALAR_P", (RTX), MEM)->integrated)
/* 1 if RTX is a mem that cannot trap. */
#define MEM_NOTRAP_P(RTX) \
extern void set_mem_attrs_from_reg (rtx, rtx);
extern void set_reg_attrs_for_parm (rtx, rtx);
extern void set_reg_pointer_align (rtx, unsigned int);
+extern int mem_expr_equal_p (tree, tree);
/* In rtl.c */
extern rtx rtx_alloc_stat (RTX_CODE MEM_STAT_DECL);
rtx);
extern rtx simplify_ternary_operation (enum rtx_code, enum machine_mode,
enum machine_mode, rtx, rtx, rtx);
+extern rtx simplify_const_relational_operation (enum rtx_code,
+ enum machine_mode, rtx, rtx);
extern rtx simplify_relational_operation (enum rtx_code, enum machine_mode,
- rtx, rtx);
+ enum machine_mode, rtx, rtx);
extern rtx simplify_gen_binary (enum rtx_code, enum machine_mode, rtx, rtx);
extern rtx simplify_gen_unary (enum rtx_code, enum machine_mode, rtx,
enum machine_mode);
extern int rtx_to_tree_code (enum rtx_code);
/* 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 an 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 (rtx, enum rtx_code);
-extern int address_cost (rtx, enum machine_mode);
extern int delete_trivially_dead_insns (rtx, int);
#ifdef BUFSIZ
extern int cse_main (rtx, int, int, FILE *);
#endif
-extern void cse_end_of_basic_block (rtx, struct cse_basic_block_data *,
- int, int, int);
extern void cse_condition_code_reg (void);
/* In jump.c */
/* In loop.c */
extern void init_loop (void);
-extern rtx libcall_other_reg (rtx, rtx);
#ifdef BUFSIZ
extern void loop_optimize (rtx, FILE *, int);
#endif
extern void branch_target_load_optimize (rtx, bool);
-extern void record_excess_regs (rtx, rtx, rtx *);
/* In function.c */
extern void reposition_prologue_and_epilogue_notes (rtx);
extern void dump_local_alloc (FILE *);
#endif
extern int local_alloc (void);
-extern int function_invariant_p (rtx);
/* In profile.c */
extern void init_branch_prob (void);
extern bool memory_modified_in_insn_p (rtx, rtx);
extern rtx find_base_term (rtx);
extern rtx gen_hard_reg_clobber (enum machine_mode, unsigned int);
+extern rtx get_reg_known_value (unsigned int);
+extern bool get_reg_known_equiv_p (unsigned int);
/* In sibcall.c */
typedef enum {