X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Frtl.h;h=8e673049e60fa0665101a5b0658aef8dae789d65;hb=f0f05655693152f8c0a8e3c08f34f725324a8a7e;hp=94dc136e53beb91863175e337f621b7cb4be3423;hpb=266198273393b6c897773ce84198575284b3738e;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/rtl.h b/gcc/rtl.h index 94dc136e53b..8e673049e60 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -240,20 +240,20 @@ struct rtx_def GTY((chain_next ("RTX_NEXT (&%h)"), 1 in a SYMBOL_REF, means that emit_library_call has used it as the function. */ unsigned int used : 1; - /* 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. */ + /* FIXME. This should be unused now that we do inlinining on trees, + but it is now being used for MEM_SCALAR_P. It should be renamed, + or some other field should be overloaded. */ 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; + /* 1 in a REG or PARALLEL that is the current function's return value. + 1 in a SYMBOL_REF for a weak symbol. */ + unsigned return_val : 1; /* The first element of the operands of this rtx. The number of operands and their types are controlled @@ -311,15 +311,28 @@ struct rtvec_def GTY(()) { #define GET_NUM_ELEM(RTVEC) ((RTVEC)->num_elem) #define PUT_NUM_ELEM(RTVEC, NUM) ((RTVEC)->num_elem = (NUM)) -/* Predicate yielding nonzero iff X is an rtl for a register. */ +/* Predicate yielding nonzero iff X is an rtx for a register. */ #define REG_P(X) (GET_CODE (X) == REG) +/* Predicate yielding nonzero iff X is an rtx for a memory location. */ +#define MEM_P(X) (GET_CODE (X) == MEM) + /* 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 call insn. */ +#define CALL_P(X) (GET_CODE (X) == CALL_INSN) + +/* Predicate yielding nonzero iff X is an insn that cannot jump. */ +#define NONJUMP_INSN_P(X) (GET_CODE (X) == INSN) + +/* Predicate yielding nonzero iff X is a real insn. */ +#define INSN_P(X) \ + (NONJUMP_INSN_P (X) || JUMP_P (X) || CALL_P (X)) + /* Predicate yielding nonzero iff X is a note insn. */ #define NOTE_P(X) (GET_CODE (X) == NOTE) @@ -331,11 +344,6 @@ struct rtvec_def GTY(()) { (JUMP_P (INSN) && (GET_CODE (PATTERN (INSN)) == ADDR_VEC || \ GET_CODE (PATTERN (INSN)) == ADDR_DIFF_VEC)) - -/* 1 if X is an insn. */ -#define INSN_P(X) \ - (GET_RTX_CLASS (GET_CODE(X)) == RTX_INSN) - /* 1 if X is a unary operator. */ #define UNARY_P(X) \ @@ -387,8 +395,7 @@ struct rtvec_def GTY(()) { #define CONSTANT_P(X) \ (GET_RTX_CLASS (GET_CODE (X)) == RTX_CONST_OBJ \ - || GET_CODE (X) == CONST_VECTOR \ - || GET_CODE (X) == CONSTANT_P_RTX) + || GET_CODE (X) == CONST_VECTOR) /* 1 if X can be used to represent an object. */ #define OBJECT_P(X) \ @@ -593,11 +600,11 @@ do { \ _rtx->call = 0; \ _rtx->frame_related = 0; \ _rtx->in_struct = 0; \ - _rtx->integrated = 0; \ _rtx->jump = 0; \ _rtx->unchanging = 0; \ _rtx->used = 0; \ _rtx->volatil = 0; \ + _rtx->unused_flag = 0; \ } while (0) #define XINT(RTX, N) (RTL_CHECK2 (RTX, N, 'i', 'n').rtint) @@ -676,10 +683,6 @@ do { \ They are always in the same basic block as this insn. */ #define LOG_LINKS(INSN) XEXP(INSN, 7) -#define RTX_INTEGRATED_P(RTX) \ - (RTL_FLAG_CHECK8("RTX_INTEGRATED_P", (RTX), INSN, CALL_INSN, \ - JUMP_INSN, INSN_LIST, BARRIER, CODE_LABEL, CONST, \ - NOTE)->integrated) #define RTX_UNCHANGING_P(RTX) \ (RTL_FLAG_CHECK3("RTX_UNCHANGING_P", (RTX), REG, MEM, CONCAT)->unchanging) #define RTX_FRAME_RELATED_P(RTX) \ @@ -857,6 +860,11 @@ enum reg_note 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, @@ -906,7 +914,22 @@ extern const char * const reg_note_name[]; /* Opaque data. */ #define NOTE_DATA(INSN) RTL_CHECKC1 (INSN, 4, NOTE) +#define NOTE_DELETED_LABEL_NAME(INSN) XCSTR (INSN, 4, NOTE) +#ifdef USE_MAPPED_LOCATION +#define NOTE_SOURCE_LOCATION(INSN) XCUINT (INSN, 5, NOTE) +#define NOTE_EXPANDED_LOCATION(XLOC, INSN) \ + (XLOC) = expand_location (NOTE_SOURCE_LOCATION (INSN)) +#define SET_INSN_DELETED(INSN) \ + (PUT_CODE (INSN, NOTE), NOTE_LINE_NUMBER (INSN) = NOTE_INSN_DELETED) +#else +#define NOTE_EXPANDED_LOCATION(XLOC, INSN) \ + ((XLOC).file = NOTE_SOURCE_FILE (INSN), \ + (XLOC).line = NOTE_LINE_NUMBER (INSN)) #define NOTE_SOURCE_FILE(INSN) XCSTR (INSN, 4, NOTE) +#define SET_INSN_DELETED(INSN) \ + (PUT_CODE (INSN, NOTE), NOTE_SOURCE_FILE (INSN) = 0, \ + NOTE_LINE_NUMBER (INSN) = NOTE_INSN_DELETED) +#endif #define NOTE_BLOCK(INSN) XCTREE (INSN, 4, NOTE) #define NOTE_EH_HANDLER(INSN) XCINT (INSN, 4, NOTE) #define NOTE_BASIC_BLOCK(INSN) XCBBDEF (INSN, 4, NOTE) @@ -958,7 +981,7 @@ enum insn_note NOTE_INSN_DELETED, /* These are used to mark the beginning and end of a lexical block. - See NOTE_BLOCK, identify_blocks and reorder_blocks. */ + See NOTE_BLOCK and reorder_blocks. */ NOTE_INSN_BLOCK_BEG, NOTE_INSN_BLOCK_END, @@ -1018,6 +1041,10 @@ enum insn_note /* 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, @@ -1126,7 +1153,7 @@ enum label_kind /* 1 if RTX is a reg or parallel that is the current function's return value. */ #define REG_FUNCTION_VALUE_P(RTX) \ - (RTL_FLAG_CHECK2("REG_FUNCTION_VALUE_P", (RTX), REG, PARALLEL)->integrated) + (RTL_FLAG_CHECK2("REG_FUNCTION_VALUE_P", (RTX), REG, PARALLEL)->return_val) /* 1 if RTX is a reg that corresponds to a variable declared by the user. */ #define REG_USERVAR_P(RTX) \ @@ -1136,6 +1163,10 @@ enum label_kind #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))) @@ -1187,6 +1218,9 @@ extern unsigned int subreg_regno_offset (unsigned int, enum machine_mode, extern bool subreg_offset_representable_p (unsigned int, enum machine_mode, unsigned int, enum machine_mode); extern unsigned int subreg_regno (rtx); +extern unsigned HOST_WIDE_INT nonzero_bits (rtx, enum machine_mode); +extern unsigned int num_sign_bit_copies (rtx, enum machine_mode); + /* 1 if RTX is a subreg containing a reg that is already known to be sign- or zero-extended from the mode of the subreg to the mode of @@ -1228,8 +1262,12 @@ do { \ XSTR (XCVECEXP (RTX, 4, N, ASM_OPERANDS), 0) #define ASM_OPERANDS_INPUT_MODE(RTX, N) \ GET_MODE (XCVECEXP (RTX, 4, N, ASM_OPERANDS)) +#ifdef USE_MAPPED_LOCATION +#define ASM_OPERANDS_SOURCE_LOCATION(RTX) XCUINT (RTX, 5, ASM_OPERANDS) +#else #define ASM_OPERANDS_SOURCE_FILE(RTX) XCSTR (RTX, 5, ASM_OPERANDS) #define ASM_OPERANDS_SOURCE_LINE(RTX) XCINT (RTX, 6, ASM_OPERANDS) +#endif /* 1 if RTX is a mem and we should keep the alias set for this mem unchanged when we access a component. Set to 1, or example, when we @@ -1251,7 +1289,7 @@ do { \ /* 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) \ @@ -1395,7 +1433,7 @@ do { \ /* 1 if RTX is a symbol_ref for a weak symbol. */ #define SYMBOL_REF_WEAK(RTX) \ - (RTL_FLAG_CHECK1("SYMBOL_REF_WEAK", (RTX), SYMBOL_REF)->integrated) + (RTL_FLAG_CHECK1("SYMBOL_REF_WEAK", (RTX), SYMBOL_REF)->return_val) /* The tree (decl or constant) associated with the symbol, or null. */ #define SYMBOL_REF_DECL(RTX) X0TREE ((RTX), 2) @@ -1525,17 +1563,12 @@ do { \ #ifndef USE_STORE_PRE_DECREMENT #define USE_STORE_PRE_DECREMENT(MODE) HAVE_PRE_DECREMENT #endif - -/* Determine if the insn is a PHI node. */ -#define PHI_NODE_P(X) \ - ((X) && GET_CODE (X) == INSN \ - && GET_CODE (PATTERN (X)) == SET \ - && GET_CODE (SET_SRC (PATTERN (X))) == PHI) /* Nonzero if we need to distinguish between the return value of this function and the return value of a function called by this function. This helps integrate.c. - This is 1 until after the rtl generation pass. */ + This is 1 until after the rtl generation pass. + ??? It appears that this is 1 only when expanding trees to RTL. */ extern int rtx_equal_function_value_matters; /* Nonzero when we are generating CONCATs. */ @@ -1569,6 +1602,7 @@ extern void set_reg_attrs_from_mem (rtx, 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); @@ -1594,9 +1628,6 @@ extern rtx gen_rtx_REG_offset (rtx, enum machine_mode, unsigned int, int); extern rtx gen_label_rtx (void); extern int subreg_hard_regno (rtx, int); extern rtx gen_lowpart_common (enum machine_mode, rtx); -extern rtx gen_lowpart_general (enum machine_mode, rtx); -extern rtx (*gen_lowpart) (enum machine_mode mode, rtx x); - /* In cse.c */ extern rtx gen_lowpart_if_possible (enum machine_mode, rtx); @@ -1691,6 +1722,7 @@ extern rtx next_active_insn (rtx); extern int active_insn_p (rtx); extern rtx prev_label (rtx); extern rtx next_label (rtx); +extern rtx skip_consecutive_labels (rtx); extern rtx next_cc0_user (rtx); extern rtx prev_cc0_setter (rtx); @@ -1750,8 +1782,10 @@ extern rtx simplify_binary_operation (enum rtx_code, enum machine_mode, rtx, 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); @@ -1828,7 +1862,6 @@ extern int reg_overlap_mentioned_p (rtx, rtx); extern rtx set_of (rtx, rtx); extern void note_stores (rtx, void (*) (rtx, rtx, void *), void *); extern void note_uses (rtx *, void (*) (rtx *, void *), void *); -extern rtx reg_set_last (rtx, rtx); extern int dead_or_set_p (rtx, rtx); extern int dead_or_set_regno_p (rtx, unsigned int); extern rtx find_reg_note (rtx, enum reg_note, rtx); @@ -1893,8 +1926,6 @@ extern const char *decode_asm_operands (rtx, rtx *, rtx **, const char **, extern enum reg_class reg_preferred_class (int); extern enum reg_class reg_alternate_class (int); -extern rtx get_first_nonparm_insn (void); - extern void split_all_insns (int); extern void split_all_insns_noflow (void); @@ -1987,6 +2018,11 @@ extern GTY(()) rtx return_address_pointer_rtx; #ifndef NO_GENRTL_H #include "genrtl.h" +#ifndef USE_MAPPED_LOCATION +#undef gen_rtx_ASM_OPERANDS +#define gen_rtx_ASM_OPERANDS(MODE, ARG0, ARG1, ARG2, ARG3, ARG4, LOC) \ + gen_rtx_fmt_ssiEEsi (ASM_OPERANDS, (MODE), (ARG0), (ARG1), (ARG2), (ARG3), (ARG4), (LOC).file, (LOC).line) +#endif #endif /* There are some RTL codes that require special attention; the @@ -2071,9 +2107,6 @@ extern rtx gen_rtx_MEM (enum machine_mode, rtx); extern rtx output_constant_def (tree, int); extern rtx lookup_constant_def (tree); -/* Called from integrate.c when a deferred constant is inlined. */ -extern void notice_rtl_inlining_of_deferred_constant (void); - /* Nonzero after the second flow pass has completed. Set to 1 or 0 by toplev.c */ extern int flow2_completed; @@ -2142,14 +2175,13 @@ extern enum rtx_code reversed_comparison_code_parts (enum rtx_code, rtx, rtx, rtx); extern void delete_for_peephole (rtx, rtx); extern int condjump_in_parallel_p (rtx); -extern void never_reached_warning (rtx, rtx); extern void purge_line_number_notes (rtx); -extern void copy_loop_headers (rtx); /* In emit-rtl.c. */ extern int max_reg_num (void); extern int max_label_num (void); extern int get_first_label_num (void); +extern void maybe_set_first_label_num (rtx); extern void delete_insns_since (rtx); extern void mark_reg_pointer (rtx, int); extern void mark_user_reg (rtx); @@ -2167,6 +2199,7 @@ extern void pop_topmost_sequence (void); extern void reverse_comparison (rtx); extern void set_new_first_and_last_insn (rtx, rtx); extern void set_new_last_label_num (int); +extern void unshare_all_rtl (void); extern void unshare_all_rtl_again (rtx); extern void unshare_all_rtl_in_chain (rtx); extern void verify_rtl_sharing (void); @@ -2188,6 +2221,7 @@ void restore_line_number_status (int old_value); extern void renumber_insns (FILE *); extern void remove_unnecessary_notes (void); extern rtx delete_insn (rtx); +extern rtx entry_of_function (void); extern void delete_insn_chain (rtx, rtx); extern rtx unlink_insn_chain (rtx, rtx); extern rtx delete_insn_and_edges (rtx); @@ -2237,14 +2271,13 @@ extern void init_loop (void); #ifdef BUFSIZ extern void loop_optimize (rtx, FILE *, int); #endif -extern void branch_target_load_optimize (rtx, bool); +extern void branch_target_load_optimize (bool); /* In function.c */ extern void reposition_prologue_and_epilogue_notes (rtx); extern void thread_prologue_and_epilogue_insns (rtx); extern int prologue_epilogue_contains (rtx); extern int sibcall_epilogue_contains (rtx); -extern void preserve_rtl_expr_result (rtx); extern void mark_temp_addr_taken (rtx); extern void update_temp_slot_address (rtx, rtx); extern void purge_addressof (rtx); @@ -2319,8 +2352,6 @@ extern void cannot_change_mode_set_regs (HARD_REG_SET *, extern bool invalid_mode_change_p (unsigned int, enum reg_class, enum machine_mode); -extern int delete_null_pointer_checks (rtx); - /* In regmove.c */ #ifdef BUFSIZ extern void regmove_optimize (rtx, int, FILE *); @@ -2338,14 +2369,9 @@ extern void dump_local_alloc (FILE *); #endif extern int local_alloc (void); -/* In profile.c */ -extern void init_branch_prob (void); -extern void branch_prob (void); -extern void end_branch_prob (void); - /* In reg-stack.c */ #ifdef BUFSIZ -extern bool reg_to_stack (rtx, FILE *); +extern bool reg_to_stack (FILE *); #endif /* In calls.c */ @@ -2416,16 +2442,8 @@ extern rtx addr_side_effect_eval (rtx, int, int); 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); - -/* In sibcall.c */ -typedef enum { - sibcall_use_normal = 1, - sibcall_use_tail_recursion, - sibcall_use_sibcall -} sibcall_use_t; - -extern void optimize_sibling_and_tail_recursive_calls (void); -extern void replace_call_placeholder (rtx, sibcall_use_t); +extern rtx get_reg_known_value (unsigned int); +extern bool get_reg_known_equiv_p (unsigned int); #ifdef STACK_REGS extern int stack_regs_mentioned (rtx insn); @@ -2451,7 +2469,8 @@ extern void tracer (void); extern void variable_tracking_main (void); /* In stor-layout.c. */ -extern void get_mode_bounds (enum machine_mode, int, rtx *, rtx *); +extern void get_mode_bounds (enum machine_mode, int, enum machine_mode, + rtx *, rtx *); /* In loop-unswitch.c */ extern rtx reversed_condition (rtx); @@ -2464,4 +2483,29 @@ extern void simplify_using_condition (rtx, rtx *, struct bitmap_head_def *); /* In ra.c. */ extern void reg_alloc (void); +/* In modulo-sched.c. */ +#ifdef BUFSIZ +extern void sms_schedule (FILE *); +#endif + +struct rtl_hooks +{ + rtx (*gen_lowpart) (enum machine_mode, rtx); + rtx (*reg_nonzero_bits) (rtx, enum machine_mode, rtx, enum machine_mode, + unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT *); + rtx (*reg_num_sign_bit_copies) (rtx, enum machine_mode, rtx, enum machine_mode, + unsigned int, unsigned int *); + + /* Whenever you add entries here, make sure you adjust hosthooks-def.h. */ +}; + +/* Each pass can provide its own. */ +extern struct rtl_hooks rtl_hooks; + +/* ... but then it has to restore these. */ +extern const struct rtl_hooks general_rtl_hooks; + +/* Keep this for the nonce. */ +#define gen_lowpart rtl_hooks.gen_lowpart + #endif /* ! GCC_RTL_H */