X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Frtl.h;h=263de4e44167aca3c4e1779750709b3ce6dd2297;hb=a9ce5bdcb05262a1f331def9b0c6783cdbba9d28;hp=fc344cef75bdc23d9e61495b3fe4a351d69560fa;hpb=78147e84503de46c41e27d1c461a37fcaf37a25f;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/rtl.h b/gcc/rtl.h index fc344cef75b..263de4e4416 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -87,6 +87,7 @@ typedef union rtunion_def { HOST_WIDE_INT rtwint; int rtint; + unsigned int rtuint; const char *rtstr; struct rtx_def *rtx; struct rtvec_def *rtvec; @@ -148,7 +149,7 @@ typedef struct rtx_def 0 if the MEM was a variable or the result of a * operator in C; 1 if it was the result of a . or -> operator (on a struct) in C. 1 in a REG if the register is used only in exit code a loop. - 1 in a SUBREG expression if was generated from a variable with a + 1 in a SUBREG expression if was generated from a variable with a promoted mode. 1 in a CODE_LABEL if the label is used for nonlocal gotos and must not be deleted even if its count is zero. @@ -162,7 +163,7 @@ typedef struct rtx_def unsigned int in_struct : 1; /* 1 if this rtx is used. This is used for copying shared structure. See `unshare_all_rtl'. - In a REG, this is not needed for that purpose, and used instead + In a REG, this is not needed for that purpose, and used instead in `leaf_renumber_regs_insn'. In a SYMBOL_REF, means that emit_library_call has used it as the function. */ @@ -173,7 +174,7 @@ typedef struct rtx_def 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. + 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; @@ -338,6 +339,7 @@ extern void rtvec_check_failed_bounds PARAMS ((rtvec, int, #define XCWINT(RTX, N, C) (RTL_CHECKC1(RTX, N, C).rtwint) #define XCINT(RTX, N, C) (RTL_CHECKC1(RTX, N, C).rtint) +#define XCUINT(RTX, N, C) (RTL_CHECKC1(RTX, N, C).rtuint) #define XCSTR(RTX, N, C) (RTL_CHECKC1(RTX, N, C).rtstr) #define XCEXP(RTX, N, C) (RTL_CHECKC1(RTX, N, C).rtx) #define XCVEC(RTX, N, C) (RTL_CHECKC1(RTX, N, C).rtvec) @@ -396,101 +398,141 @@ extern void rtvec_check_failed_bounds PARAMS ((rtvec, int, clear, the insn should be executed only if the branch is not taken. */ #define INSN_FROM_TARGET_P(INSN) ((INSN)->in_struct) +#define ADDR_DIFF_VEC_FLAGS(RTX) X0ADVFLAGS(RTX, 4) + +#define CSELIB_VAL_PTR(RTX) X0CSELIB(RTX, 0) + /* Holds a list of notes on what this insn does to various REGs. - It is a chain of EXPR_LIST rtx's, where the second operand - is the chain pointer and the first operand is the REG being described. + It is a chain of EXPR_LIST rtx's, where the second operand is the + chain pointer and the first operand is the REG being described. The mode field of the EXPR_LIST contains not a real machine mode - but a value that says what this note says about the REG: - REG_DEAD means that the value in REG dies in this insn (i.e., it is - not needed past this insn). If REG is set in this insn, the REG_DEAD - note may, but need not, be omitted. - REG_INC means that the REG is autoincremented or autodecremented. - REG_EQUIV describes the insn as a whole; it says that the insn - sets a register to a constant value or to be equivalent to a memory - address. If the register is spilled to the stack then the constant - value should be substituted for it. The contents of the REG_EQUIV - is the constant value or memory address, which may be different - from the source of the SET although it has the same value. A - REG_EQUIV note may also appear on an insn which copies a register - parameter to a pseudo-register, if there is a memory address which - could be used to hold that pseudo-register throughout the function. - REG_EQUAL is like REG_EQUIV except that the destination - is only momentarily equal to the specified rtx. Therefore, it - cannot be used for substitution; but it can be used for cse. - REG_RETVAL means that this insn copies the return-value of - a library call out of the hard reg for return values. This note - is actually an INSN_LIST and it points to the first insn involved - in setting up arguments for the call. flow.c uses this to delete - the entire library call when its result is dead. - REG_LIBCALL is the inverse of REG_RETVAL: it goes on the first insn - of the library call and points at the one that has the REG_RETVAL. - REG_WAS_0 says that the register set in this insn held 0 before the insn. - The contents of the note is the insn that stored the 0. - If that insn is deleted or patched to a NOTE, the REG_WAS_0 is inoperative. - The REG_WAS_0 note is actually an INSN_LIST, not an EXPR_LIST. - REG_NONNEG means that the register is always nonnegative during - the containing loop. This is used in branches so that decrement and - branch instructions terminating on zero can be matched. There must be - an insn pattern in the md file named `decrement_and_branch_until_zero' - or else this will never be added to any instructions. - REG_NO_CONFLICT means there is no conflict *after this insn* - between the register in the note and the destination of this insn. - REG_UNUSED identifies a register set in this insn and never used. - REG_CC_SETTER and REG_CC_USER link a pair of insns that set and use - CC0, respectively. Normally, these are required to be consecutive insns, - but we permit putting a cc0-setting insn in the delay slot of a branch - as long as only one copy of the insn exists. In that case, these notes - point from one to the other to allow code generation to determine what - any require information and to properly update CC_STATUS. - REG_LABEL points to a CODE_LABEL. Used by non-JUMP_INSNs to - say that the CODE_LABEL contained in the REG_LABEL note is used - by the insn. - REG_DEP_ANTI is used in LOG_LINKS which represent anti (write after read) - dependencies. REG_DEP_OUTPUT is used in LOG_LINKS which represent output - (write after write) dependencies. Data dependencies, which are the only - type of LOG_LINK created by flow, are represented by a 0 reg note kind. */ -/* 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_EXEC_COUNT is attached to the first insn of each basic block, and - the first insn after each CALL_INSN. It indicates how many times this - block was executed. - 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. - 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 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_SAVE_NOTE is used by haifa-sched to save NOTE_INSN notes - across scheduling. */ + but a value from enum reg_note. */ #define REG_NOTES(INSN) XEXP(INSN, 6) -#define ADDR_DIFF_VEC_FLAGS(RTX) X0ADVFLAGS(RTX, 4) - -#define CSELIB_VAL_PTR(RTX) X0CSELIB(RTX, 0) - /* Don't forget to change reg_note_name in rtl.c. */ -enum reg_note { REG_DEAD = 1, REG_INC = 2, REG_EQUIV = 3, REG_WAS_0 = 4, - REG_EQUAL = 5, REG_RETVAL = 6, REG_LIBCALL = 7, - REG_NONNEG = 8, REG_NO_CONFLICT = 9, REG_UNUSED = 10, - 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_FRAME_RELATED_EXPR = 22, REG_EH_REGION = 23, - REG_EH_RETHROW = 24, REG_SAVE_NOTE = 25 }; +enum reg_note +{ + /* The value in REG dies in this insn (i.e., it is not needed past + this insn). If REG is set in this insn, the REG_DEAD note may, + but need not, be omitted. */ + REG_DEAD = 1, + + /* The REG is autoincremented or autodecremented. */ + REG_INC, + + /* Describes the insn as a whole; it says that the insn sets a register + to a constant value or to be equivalent to a memory address. If the + register is spilled to the stack then the constant value should be + substituted for it. The contents of the REG_EQUIV is the constant + value or memory address, which may be different from the source of + the SET although it has the same value. A REG_EQUIV note may also + appear on an insn which copies a register parameter to a pseudo-register, + if there is a memory address which could be used to hold that + pseudo-register throughout the function. */ + REG_EQUIV, + + /* Like REG_EQUIV except that the destination is only momentarily equal + to the specified rtx. Therefore, it cannot be used for substitution; + but it can be used for cse. */ + REG_EQUAL, + + /* The register set in this insn held 0 before the insn. The contents of + the note is the insn that stored the 0. If that insn is deleted or + patched to a NOTE, the REG_WAS_0 is inoperative. The REG_WAS_0 note + is actually an INSN_LIST, not an EXPR_LIST. */ + REG_WAS_0, + + /* This insn copies the return-value of a library call out of the hard reg + for return values. This note is actually an INSN_LIST and it points to + the first insn involved in setting up arguments for the call. flow.c + uses this to delete the entire library call when its result is dead. */ + REG_RETVAL, + + /* The inverse of REG_RETVAL: it goes on the first insn of the library call + and points at the one that has the REG_RETVAL. */ + REG_LIBCALL, + + /* The register is always nonnegative during the containing loop. This is + used in branches so that decrement and branch instructions terminating + on zero can be matched. There must be an insn pattern in the md file + named `decrement_and_branch_until_zero' or else this will never be added + to any instructions. */ + REG_NONNEG, + + /* There is no conflict *after this insn* between the register in the note + and the destination of this insn. */ + REG_NO_CONFLICT, + + /* Identifies a register set in this insn and never used. */ + REG_UNUSED, + + /* REG_CC_SETTER and REG_CC_USER link a pair of insns that set and use CC0, + respectively. Normally, these are required to be consecutive insns, but + we permit putting a cc0-setting insn in the delay slot of a branch as + long as only one copy of the insn exists. In that case, these notes + point from one to the other to allow code generation to determine what + any require information and to properly update CC_STATUS. */ + REG_CC_SETTER, REG_CC_USER, + + /* Points to a CODE_LABEL. Used by non-JUMP_INSNs to say that the + CODE_LABEL contained in the REG_LABEL note is used by the insn. */ + REG_LABEL, + + /* REG_DEP_ANTI and REG_DEP_OUTPUT are used in LOG_LINKS to represent + write-after-read and write-after-write dependencies respectively. + Data dependencies, which are the only type of LOG_LINK created by + 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, + + /* REG_EXEC_COUNT is attached to the first insn of each basic block, and + the first insn after each CALL_INSN. It indicates how many times this + block was executed. */ + REG_EXEC_COUNT, + + /* Attached to a call insn; indicates that the call is malloc-like and + that the pointer returned cannot alias anything else. */ + REG_NOALIAS, + + /* Used to optimize rtl generated by dynamic stack allocations for targets + 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, + + /* 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_FRAME_RELATED_EXPR, + + /* Indicates that REG holds the exception context for the function. + This context is shared by inline functions, so the code to acquire + the real exception context is delayed until after inlining. */ + REG_EH_CONTEXT, + + /* Indicates what exception region an INSN belongs in. This is used to + indicate what region to which a call may throw. REGION 0 indicates + that a call cannot throw at all. REGION -1 indicates that it cannot + 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 +}; + /* The base value for branch probability notes. */ #define REG_BR_PROB_BASE 10000 @@ -613,7 +655,7 @@ extern const char * const note_insn_name[]; #define LABEL_ALTERNATE_NAME(RTX) XCSTR(RTX, 7, CODE_LABEL) /* The original regno this ADDRESSOF was built for. */ -#define ADDRESSOF_REGNO(RTX) XCINT(RTX, 1, ADDRESSOF) +#define ADDRESSOF_REGNO(RTX) XCUINT(RTX, 1, ADDRESSOF) /* The variable in the register we took the address of. */ #define ADDRESSOF_DECL(RTX) XCTREE(RTX, 2, ADDRESSOF) @@ -642,7 +684,7 @@ extern const char * const note_insn_name[]; /* For a REG rtx, REGNO extracts the register number. */ -#define REGNO(RTX) XCINT(RTX, 0, REG) +#define REGNO(RTX) XCUINT(RTX, 0, REG) /* For a REG rtx, REG_FUNCTION_VALUE_P is nonzero if the reg is the current function's return value. */ @@ -660,12 +702,12 @@ extern const char * const note_insn_name[]; SUBREG_WORD extracts the word-number. */ #define SUBREG_REG(RTX) XCEXP(RTX, 0, SUBREG) -#define SUBREG_WORD(RTX) XCINT(RTX, 1, SUBREG) +#define SUBREG_WORD(RTX) XCUINT(RTX, 1, SUBREG) /* 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 the reg. SUBREG_PROMOTED_UNSIGNED_P gives the signedness of the - extension. + extension. When used as a LHS, is means that this extension must be done when assigning to SUBREG_REG. */ @@ -999,8 +1041,10 @@ extern rtx gen_lowpart_if_possible PARAMS ((enum machine_mode, rtx)); extern rtx gen_highpart PARAMS ((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, int, int, enum machine_mode)); -extern rtx operand_subword_force PARAMS ((rtx, int, enum machine_mode)); +extern rtx operand_subword PARAMS ((rtx, unsigned int, int, + enum machine_mode)); +extern rtx operand_subword_force PARAMS ((rtx, unsigned int, + enum machine_mode)); extern int subreg_lowpart_p PARAMS ((rtx)); extern rtx make_safe_from PARAMS ((rtx, rtx)); extern rtx convert_memory_address PARAMS ((enum machine_mode, rtx)); @@ -1101,8 +1145,10 @@ extern rtx gen_bge PARAMS ((rtx)); extern rtx gen_ble PARAMS ((rtx)); extern rtx gen_mem_addressof PARAMS ((rtx, union tree_node *)); extern rtx eliminate_constant_term PARAMS ((rtx, rtx *)); -extern rtx expand_complex_abs PARAMS ((enum machine_mode, rtx, rtx, int)); -extern enum machine_mode choose_hard_reg_mode PARAMS ((int, int)); +extern rtx expand_complex_abs PARAMS ((enum machine_mode, rtx, rtx, + int)); +extern enum machine_mode choose_hard_reg_mode PARAMS ((unsigned int, + unsigned int)); extern void set_unique_reg_note PARAMS ((rtx, enum reg_note, rtx)); /* Functions in rtlanal.c */ @@ -1126,16 +1172,21 @@ extern int reg_set_p PARAMS ((rtx, rtx)); extern rtx single_set PARAMS ((rtx)); extern int multiple_sets PARAMS ((rtx)); extern rtx find_last_value PARAMS ((rtx, rtx *, rtx, int)); -extern int refers_to_regno_p PARAMS ((int, int, rtx, rtx *)); +extern int refers_to_regno_p PARAMS ((unsigned int, unsigned int, + rtx, rtx *)); extern int reg_overlap_mentioned_p PARAMS ((rtx, rtx)); -extern void note_stores PARAMS ((rtx, void (*)(rtx, rtx, void *), void *)); +extern void note_stores PARAMS ((rtx, + void (*) (rtx, 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, int)); +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, int)); +extern rtx find_regno_note PARAMS ((rtx, enum reg_note, + unsigned int)); extern int find_reg_fusage PARAMS ((rtx, enum rtx_code, rtx)); -extern int find_regno_fusage PARAMS ((rtx, enum rtx_code, int)); +extern int find_regno_fusage PARAMS ((rtx, enum rtx_code, + unsigned int)); extern void remove_note PARAMS ((rtx, rtx)); extern int side_effects_p PARAMS ((rtx)); extern int volatile_refs_p PARAMS ((rtx)); @@ -1143,11 +1194,12 @@ extern int volatile_insn_p PARAMS ((rtx)); extern int may_trap_p PARAMS ((rtx)); extern int inequality_comparisons_p PARAMS ((rtx)); extern rtx replace_rtx PARAMS ((rtx, rtx, rtx)); -extern rtx replace_regs PARAMS ((rtx, rtx *, int, int)); +extern rtx replace_regs PARAMS ((rtx, rtx *, unsigned int, + int)); extern int computed_jump_p PARAMS ((rtx)); typedef int (*rtx_function) PARAMS ((rtx *, void *)); extern int for_each_rtx PARAMS ((rtx *, rtx_function, void *)); -extern rtx regno_use_in PARAMS ((int, rtx)); +extern rtx regno_use_in PARAMS ((unsigned int, rtx)); 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 *)); @@ -1199,7 +1251,7 @@ extern rtx const_true_rtx; extern rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE]; -/* Returns a constant 0 rtx in mode MODE. Integer modes are treated the +/* Returns a constant 0 rtx in mode MODE. Integer modes are treated the same as VOIDmode. */ #define CONST0_RTX(MODE) (const_tiny_rtx[0][(int) (MODE)]) @@ -1339,7 +1391,7 @@ extern rtx gen_rtx_MEM PARAMS ((enum machine_mode, rtx)); /* 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 + frame pointer nor stack pointer are necessarily fixed relative to the CFA until after reload. */ #define virtual_cfa_rtx (global_rtl[GR_VIRTUAL_CFA]) @@ -1486,9 +1538,9 @@ extern void remove_unncessary_notes PARAMS ((void)); extern void add_clobbers PARAMS ((rtx, int)); /* In combine.c */ -extern int combine_instructions PARAMS ((rtx, int)); -extern int extended_count PARAMS ((rtx, enum machine_mode, int)); -extern rtx remove_death PARAMS ((int, rtx)); +extern int combine_instructions PARAMS ((rtx, unsigned int)); +extern unsigned int extended_count PARAMS ((rtx, enum machine_mode, int)); +extern rtx remove_death PARAMS ((unsigned int, rtx)); #ifdef BUFSIZ extern void dump_combine_stats PARAMS ((FILE *)); extern void dump_combine_total_stats PARAMS ((FILE *)); @@ -1585,8 +1637,8 @@ extern void init_reg_sets PARAMS ((void)); extern void regset_release_memory PARAMS ((void)); extern void regclass_init PARAMS ((void)); extern void regclass PARAMS ((rtx, int, FILE *)); -extern void reg_scan PARAMS ((rtx, int, int)); -extern void reg_scan_update PARAMS ((rtx, rtx, int)); +extern void reg_scan PARAMS ((rtx, unsigned int, int)); +extern void reg_scan_update PARAMS ((rtx, rtx, unsigned int)); extern void fix_register PARAMS ((const char *, int, int)); extern void delete_null_pointer_checks PARAMS ((rtx)); @@ -1709,6 +1761,7 @@ extern void fancy_abort PARAMS ((const char *, int, const char *)) #endif /* In alias.c */ +extern rtx canon_rtx PARAMS ((rtx)); extern int true_dependence PARAMS ((rtx, enum machine_mode, rtx, int (*)(rtx))); extern int read_dependence PARAMS ((rtx, rtx)); @@ -1745,4 +1798,8 @@ extern void convert_from_ssa PARAMS ((void)); extern rtx stack_limit_rtx; +/* In regrename.c */ + +extern void regrename_optimize PARAMS ((void)); + #endif /* _RTL_H */