Commit 1935e8a8 by Kazu Hirata Committed by Kazu Hirata

basic-block.h (REG_BASIC_BLOCK): Use VEC instead of VARRAY.

	* basic-block.h (REG_BASIC_BLOCK): Use VEC instead of VARRAY.
	* flow.c (reg_n_info): Change the type to
	VEC(reg_info_p,heap) *.
	* regclass.c (allocate_reg_info, free_reg_info): Use VEC
	instead of VARRAY.
	* regs.h (reg_info_p): New.
	(REG_N_REFS, REG_FREQ, REG_N_SETS, REG_N_DEATHS,
	REG_N_CALLS_CROSSED, REG_N_THROWING_CALLS_CROSSED,
	REG_LIVE_LENGTH, REGNO_FIRST_UID, REGNO_LAST_UID): Use VEC
	instead of VARRAY.

From-SVN: r112942
parent 062e124a
2006-04-14 Kazu Hirata <kazu@codesourcery.com>
* basic-block.h (REG_BASIC_BLOCK): Use VEC instead of VARRAY.
* flow.c (reg_n_info): Change the type to
VEC(reg_info_p,heap) *.
* regclass.c (allocate_reg_info, free_reg_info): Use VEC
instead of VARRAY.
* regs.h (reg_info_p): New.
(REG_N_REFS, REG_FREQ, REG_N_SETS, REG_N_DEATHS,
REG_N_CALLS_CROSSED, REG_N_THROWING_CALLS_CROSSED,
REG_LIVE_LENGTH, REGNO_FIRST_UID, REGNO_LAST_UID): Use VEC
instead of VARRAY.
2006-04-13 Eric Botcazou <ebotcazou@adacore.com> 2006-04-13 Eric Botcazou <ebotcazou@adacore.com>
* params.def (PARAM_MAX_SCHED_READY_INSNS): New parameter, * params.def (PARAM_MAX_SCHED_READY_INSNS): New parameter,
......
...@@ -460,7 +460,8 @@ extern bitmap_obstack reg_obstack; ...@@ -460,7 +460,8 @@ extern bitmap_obstack reg_obstack;
#define REG_BLOCK_UNKNOWN -1 #define REG_BLOCK_UNKNOWN -1
#define REG_BLOCK_GLOBAL -2 #define REG_BLOCK_GLOBAL -2
#define REG_BASIC_BLOCK(N) (VARRAY_REG (reg_n_info, N)->basic_block) #define REG_BASIC_BLOCK(N) \
(VEC_index (reg_info_p, reg_n_info, N)->basic_block)
/* Stuff for recording basic block info. */ /* Stuff for recording basic block info. */
......
...@@ -182,7 +182,7 @@ int max_regno; ...@@ -182,7 +182,7 @@ int max_regno;
/* Indexed by n, giving various register information */ /* Indexed by n, giving various register information */
varray_type reg_n_info; VEC(reg_info_p,heap) *reg_n_info;
/* Regset of regs live when calls to `setjmp'-like functions happen. */ /* Regset of regs live when calls to `setjmp'-like functions happen. */
/* ??? Does this exist only for the setjmp-clobbered warning message? */ /* ??? Does this exist only for the setjmp-clobbered warning message? */
......
...@@ -2176,13 +2176,28 @@ allocate_reg_info (size_t num_regs, int new_p, int renumber_p) ...@@ -2176,13 +2176,28 @@ allocate_reg_info (size_t num_regs, int new_p, int renumber_p)
if (!reg_n_info) if (!reg_n_info)
{ {
VARRAY_REG_INIT (reg_n_info, regno_allocated, "reg_n_info"); reg_n_info = VEC_alloc (reg_info_p, heap, regno_allocated);
VEC_safe_grow (reg_info_p, heap, reg_n_info, regno_allocated);
memset (VEC_address (reg_info_p, reg_n_info), 0,
sizeof (reg_info_p) * regno_allocated);
renumber = xmalloc (size_renumber); renumber = xmalloc (size_renumber);
reg_pref_buffer = XNEWVEC (struct reg_pref, regno_allocated); reg_pref_buffer = XNEWVEC (struct reg_pref, regno_allocated);
} }
else else
{ {
VARRAY_GROW (reg_n_info, regno_allocated); size_t old_length = VEC_length (reg_info_p, reg_n_info);
if (old_length < regno_allocated)
{
reg_info_p *addr;
VEC_safe_grow (reg_info_p, heap, reg_n_info, regno_allocated);
addr = VEC_address (reg_info_p, reg_n_info);
memset (&addr[old_length], 0,
sizeof (reg_info_p) * (regno_allocated - old_length));
}
else if (regno_allocated < old_length)
{
VEC_truncate (reg_info_p, reg_n_info, regno_allocated);
}
if (new_p) /* If we're zapping everything, no need to realloc. */ if (new_p) /* If we're zapping everything, no need to realloc. */
{ {
...@@ -2238,7 +2253,8 @@ allocate_reg_info (size_t num_regs, int new_p, int renumber_p) ...@@ -2238,7 +2253,8 @@ allocate_reg_info (size_t num_regs, int new_p, int renumber_p)
for (i = min_index+local_min; i <= max; i++) for (i = min_index+local_min; i <= max; i++)
{ {
VARRAY_REG (reg_n_info, i) = &reg_data->data[i-min_index]; VEC_replace (reg_info_p, reg_n_info, i,
&reg_data->data[i-min_index]);
REG_BASIC_BLOCK (i) = REG_BLOCK_UNKNOWN; REG_BASIC_BLOCK (i) = REG_BLOCK_UNKNOWN;
renumber[i] = -1; renumber[i] = -1;
reg_pref_buffer[i].prefclass = (char) NO_REGS; reg_pref_buffer[i].prefclass = (char) NO_REGS;
...@@ -2265,7 +2281,7 @@ free_reg_info (void) ...@@ -2265,7 +2281,7 @@ free_reg_info (void)
struct reg_info_data *reg_data; struct reg_info_data *reg_data;
struct reg_info_data *reg_next; struct reg_info_data *reg_next;
VARRAY_FREE (reg_n_info); VEC_free (reg_info_p, heap, reg_n_info);
for (reg_data = reg_info_head; reg_data; reg_data = reg_next) for (reg_data = reg_info_head; reg_data; reg_data = reg_next)
{ {
reg_next = reg_data->next; reg_next = reg_data->next;
......
...@@ -65,15 +65,20 @@ typedef struct reg_info_def ...@@ -65,15 +65,20 @@ typedef struct reg_info_def
int basic_block; /* # of basic blocks (REG n) is used in */ int basic_block; /* # of basic blocks (REG n) is used in */
} reg_info; } reg_info;
extern varray_type reg_n_info; typedef reg_info *reg_info_p;
DEF_VEC_P(reg_info_p);
DEF_VEC_ALLOC_P(reg_info_p,heap);
extern VEC(reg_info_p,heap) *reg_n_info;
/* Indexed by n, gives number of times (REG n) is used or set. */ /* Indexed by n, gives number of times (REG n) is used or set. */
#define REG_N_REFS(N) (VARRAY_REG (reg_n_info, N)->refs) #define REG_N_REFS(N) (VEC_index (reg_info_p, reg_n_info, N)->refs)
/* Estimate frequency of references to register N. */ /* Estimate frequency of references to register N. */
#define REG_FREQ(N) (VARRAY_REG (reg_n_info, N)->freq) #define REG_FREQ(N) (VEC_index (reg_info_p, reg_n_info, N)->freq)
/* The weights for each insn varries from 0 to REG_FREQ_BASE. /* The weights for each insn varries from 0 to REG_FREQ_BASE.
This constant does not need to be high, as in infrequently executed This constant does not need to be high, as in infrequently executed
...@@ -97,7 +102,7 @@ extern varray_type reg_n_info; ...@@ -97,7 +102,7 @@ extern varray_type reg_n_info;
??? both regscan and flow allocate space for this. We should settle ??? both regscan and flow allocate space for this. We should settle
on just copy. */ on just copy. */
#define REG_N_SETS(N) (VARRAY_REG (reg_n_info, N)->sets) #define REG_N_SETS(N) (VEC_index (reg_info_p, reg_n_info, N)->sets)
/* Indexed by N, gives number of insns in which register N dies. /* Indexed by N, gives number of insns in which register N dies.
Note that if register N is live around loops, it can die Note that if register N is live around loops, it can die
...@@ -105,7 +110,7 @@ extern varray_type reg_n_info; ...@@ -105,7 +110,7 @@ extern varray_type reg_n_info;
So this is only a reliable indicator of how many regions of life there are So this is only a reliable indicator of how many regions of life there are
for registers that are contained in one basic block. */ for registers that are contained in one basic block. */
#define REG_N_DEATHS(N) (VARRAY_REG (reg_n_info, N)->deaths) #define REG_N_DEATHS(N) (VEC_index (reg_info_p, reg_n_info, N)->deaths)
/* Get the number of consecutive words required to hold pseudo-reg N. */ /* Get the number of consecutive words required to hold pseudo-reg N. */
...@@ -124,13 +129,14 @@ extern varray_type reg_n_info; ...@@ -124,13 +129,14 @@ extern varray_type reg_n_info;
/* Indexed by N, gives number of CALL_INSNS across which (REG n) is live. */ /* Indexed by N, gives number of CALL_INSNS across which (REG n) is live. */
#define REG_N_CALLS_CROSSED(N) (VARRAY_REG (reg_n_info, N)->calls_crossed) #define REG_N_CALLS_CROSSED(N) \
(VEC_index (reg_info_p, reg_n_info, N)->calls_crossed)
/* Indexed by N, gives number of CALL_INSNS that may throw, across which /* Indexed by N, gives number of CALL_INSNS that may throw, across which
(REG n) is live. */ (REG n) is live. */
#define REG_N_THROWING_CALLS_CROSSED(N) \ #define REG_N_THROWING_CALLS_CROSSED(N) \
(VARRAY_REG (reg_n_info, N)->throw_calls_crossed) (VEC_index (reg_info_p, reg_n_info, N)->throw_calls_crossed)
/* Total number of instructions at which (REG n) is live. /* Total number of instructions at which (REG n) is live.
The larger this is, the less priority (REG n) gets for The larger this is, the less priority (REG n) gets for
...@@ -147,7 +153,8 @@ extern varray_type reg_n_info; ...@@ -147,7 +153,8 @@ extern varray_type reg_n_info;
is not required. global.c makes an allocno for this but does is not required. global.c makes an allocno for this but does
not try to assign a hard register to it. */ not try to assign a hard register to it. */
#define REG_LIVE_LENGTH(N) (VARRAY_REG (reg_n_info, N)->live_length) #define REG_LIVE_LENGTH(N) \
(VEC_index (reg_info_p, reg_n_info, N)->live_length)
/* Vector of substitutions of register numbers, /* Vector of substitutions of register numbers,
used to map pseudo regs into hardware regs. used to map pseudo regs into hardware regs.
...@@ -182,7 +189,7 @@ extern enum machine_mode reg_raw_mode[FIRST_PSEUDO_REGISTER]; ...@@ -182,7 +189,7 @@ extern enum machine_mode reg_raw_mode[FIRST_PSEUDO_REGISTER];
It is sometimes adjusted for subsequent changes during loop, It is sometimes adjusted for subsequent changes during loop,
but not adjusted by cse even if cse invalidates it. */ but not adjusted by cse even if cse invalidates it. */
#define REGNO_FIRST_UID(N) (VARRAY_REG (reg_n_info, N)->first_uid) #define REGNO_FIRST_UID(N) (VEC_index (reg_info_p, reg_n_info, N)->first_uid)
/* Vector indexed by regno; gives uid of last insn using that reg. /* Vector indexed by regno; gives uid of last insn using that reg.
This is computed by reg_scan for use by cse and loop. This is computed by reg_scan for use by cse and loop.
...@@ -190,7 +197,7 @@ extern enum machine_mode reg_raw_mode[FIRST_PSEUDO_REGISTER]; ...@@ -190,7 +197,7 @@ extern enum machine_mode reg_raw_mode[FIRST_PSEUDO_REGISTER];
but not adjusted by cse even if cse invalidates it. but not adjusted by cse even if cse invalidates it.
This is harmless since cse won't scan through a loop end. */ This is harmless since cse won't scan through a loop end. */
#define REGNO_LAST_UID(N) (VARRAY_REG (reg_n_info, N)->last_uid) #define REGNO_LAST_UID(N) (VEC_index (reg_info_p, reg_n_info, N)->last_uid)
/* List made of EXPR_LIST rtx's which gives pairs of pseudo registers /* List made of EXPR_LIST rtx's which gives pairs of pseudo registers
that have to go in the same hard reg. */ that have to go in the same hard reg. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment