Mercurial > hg > CbC > CbC_gcc
diff gcc/lra-int.h @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children | 1830386684a0 |
line wrap: on
line diff
--- a/gcc/lra-int.h Fri Oct 27 22:46:09 2017 +0900 +++ b/gcc/lra-int.h Thu Oct 25 07:37:49 2018 +0900 @@ -1,5 +1,5 @@ /* Local Register Allocator (LRA) intercommunication header file. - Copyright (C) 2010-2017 Free Software Foundation, Inc. + Copyright (C) 2010-2018 Free Software Foundation, Inc. Contributed by Vladimir Makarov <vmakarov@redhat.com>. This file is part of GCC. @@ -106,7 +106,7 @@ they do not conflict. */ int val; /* Offset from relative eliminate register to pesudo reg. */ - int offset; + poly_int64 offset; /* These members are set up in lra-lives.c and updated in lra-coalesce.c. */ /* The biggest size mode in which each pseudo reg is referred in @@ -122,6 +122,8 @@ /* References to the common info about each register. */ extern struct lra_reg *lra_reg_info; +extern HARD_REG_SET hard_regs_spilled_into; + /* Static info about each insn operand (common for all insns with the same ICODE). Warning: if the structure definition is changed, the initializer for debug_operand_data in lra.c should be changed @@ -166,6 +168,8 @@ /* True if there is an early clobber alternative for this operand. */ unsigned int early_clobber : 1; + /* True if the reg is clobber highed by the operand. */ + unsigned int clobber_high : 1; /* The corresponding regno of the register. */ int regno; /* Next reg info of the same insn. */ @@ -202,18 +206,23 @@ const struct operand_alternative *operand_alternative; }; +/* Negative insn alternative numbers used for special cases. */ +#define LRA_UNKNOWN_ALT -1 +#define LRA_NON_CLOBBERED_ALT -2 + /* LRA internal info about an insn (LRA internal insn representation). */ struct lra_insn_recog_data { /* The insn code. */ int icode; - /* The alternative should be used for the insn, -1 if invalid, or we - should try to use any alternative, or the insn is a debug - insn. */ + /* The alternative should be used for the insn, LRA_UNKNOWN_ALT if + unknown, or we should assume any alternative, or the insn is a + debug insn. LRA_NON_CLOBBERED_ALT means ignoring any earlier + clobbers for the insn. */ int used_insn_alternative; /* SP offset before the insn relative to one at the func start. */ - HOST_WIDE_INT sp_offset; + poly_int64 sp_offset; /* The insn itself. */ rtx_insn *insn; /* Common data for insns with the same ICODE. Asm insns (their @@ -309,7 +318,7 @@ extern void lra_process_new_insns (rtx_insn *, rtx_insn *, rtx_insn *, const char *); -extern bool lra_substitute_pseudo (rtx *, int, rtx, bool); +extern bool lra_substitute_pseudo (rtx *, int, rtx, bool, bool); extern bool lra_substitute_pseudo_within_insn (rtx_insn *, int, rtx, bool); extern lra_insn_recog_data_t lra_set_insn_recog_data (rtx_insn *); @@ -349,6 +358,7 @@ extern bool lra_constraints (bool); extern void lra_constraints_init (void); extern void lra_constraints_finish (void); +extern bool spill_hard_reg_in_range (int, enum reg_class, rtx_insn *, rtx_insn *); extern void lra_inheritance (void); extern bool lra_undo_inheritance (void); @@ -382,8 +392,8 @@ extern int lra_assignment_iter; extern int lra_assignment_iter_after_spill; extern void lra_setup_reg_renumber (int, int, bool); -extern bool lra_assign (void); - +extern bool lra_assign (bool &); +extern bool lra_split_hard_reg_for (void); /* lra-coalesce.c: */ @@ -406,8 +416,8 @@ extern void lra_debug_elim_table (void); extern int lra_get_elimination_hard_regno (int); extern rtx lra_eliminate_regs_1 (rtx_insn *, rtx, machine_mode, - bool, bool, HOST_WIDE_INT, bool); -extern void eliminate_regs_in_insn (rtx_insn *insn, bool, bool, HOST_WIDE_INT); + bool, bool, poly_int64, bool); +extern void eliminate_regs_in_insn (rtx_insn *insn, bool, bool, poly_int64); extern void lra_eliminate (bool, bool); extern void lra_eliminate_reg_if_possible (rtx *); @@ -493,7 +503,7 @@ /* Update offset from pseudos with VAL by INCR. */ static inline void -lra_update_reg_val_offset (int val, int incr) +lra_update_reg_val_offset (int val, poly_int64 incr) { int i; @@ -506,10 +516,10 @@ /* Return true if register content is equal to VAL with OFFSET. */ static inline bool -lra_reg_val_equal_p (int regno, int val, int offset) +lra_reg_val_equal_p (int regno, int val, poly_int64 offset) { if (lra_reg_info[regno].val == val - && lra_reg_info[regno].offset == offset) + && known_eq (lra_reg_info[regno].offset, offset)) return true; return false;