flow.c (find_basic_blocks): New argument `do_cleanup'.
* flow.c (find_basic_blocks): New argument `do_cleanup'. Conditionally call delete_unreachable_blocks. (free_basic_block_vars): Zero ENTRY/EXIT data. (allocate_for_life_analysis): Kill. Split into... (allocate_bb_life_data, allocate_reg_life_data): ... new functions. (life_analysis_1): Update. * gcse.c (gcse_main): Update find_basic_blocks call. * toplev.c (rest_of_compilation): Likewise. * stupid.c (stupid_life_analysis): Update life data calls. * rtl.h, output.h: Update prototypes. From-SVN: r26090
This commit is contained in:
parent
42493273de
commit
359da67d8a
|
@ -1,3 +1,16 @@
|
||||||
|
Wed Mar 31 12:32:43 1999 Richard Henderson <rth@cygnus.com>
|
||||||
|
|
||||||
|
* flow.c (find_basic_blocks): New argument `do_cleanup'.
|
||||||
|
Conditionally call delete_unreachable_blocks.
|
||||||
|
(free_basic_block_vars): Zero ENTRY/EXIT data.
|
||||||
|
(allocate_for_life_analysis): Kill. Split into...
|
||||||
|
(allocate_bb_life_data, allocate_reg_life_data): ... new functions.
|
||||||
|
(life_analysis_1): Update.
|
||||||
|
* gcse.c (gcse_main): Update find_basic_blocks call.
|
||||||
|
* toplev.c (rest_of_compilation): Likewise.
|
||||||
|
* stupid.c (stupid_life_analysis): Update life data calls.
|
||||||
|
* rtl.h, output.h: Update prototypes.
|
||||||
|
|
||||||
Wed Mar 31 12:10:00 1999 Bruce Korb <ddsinc09@ix.netcom.com>
|
Wed Mar 31 12:10:00 1999 Bruce Korb <ddsinc09@ix.netcom.com>
|
||||||
|
|
||||||
* inclhack.def (several): added spaces in tests to ensure
|
* inclhack.def (several): added spaces in tests to ensure
|
||||||
|
|
44
gcc/flow.c
44
gcc/flow.c
|
@ -340,10 +340,11 @@ static void invalidate_mems_from_autoinc PROTO ((rtx));
|
||||||
numbers in use. */
|
numbers in use. */
|
||||||
|
|
||||||
void
|
void
|
||||||
find_basic_blocks (f, nregs, file)
|
find_basic_blocks (f, nregs, file, do_cleanup)
|
||||||
rtx f;
|
rtx f;
|
||||||
int nregs ATTRIBUTE_UNUSED;
|
int nregs ATTRIBUTE_UNUSED;
|
||||||
FILE *file ATTRIBUTE_UNUSED;
|
FILE *file ATTRIBUTE_UNUSED;
|
||||||
|
int do_cleanup;
|
||||||
{
|
{
|
||||||
rtx *bb_eh_end;
|
rtx *bb_eh_end;
|
||||||
int max_uid;
|
int max_uid;
|
||||||
|
@ -402,8 +403,8 @@ find_basic_blocks (f, nregs, file)
|
||||||
make_edges (label_value_list, bb_eh_end);
|
make_edges (label_value_list, bb_eh_end);
|
||||||
|
|
||||||
/* Delete unreachable blocks. */
|
/* Delete unreachable blocks. */
|
||||||
/* ??? Do this conditionally, or make this another entry point? */
|
|
||||||
|
|
||||||
|
if (do_cleanup)
|
||||||
delete_unreachable_blocks ();
|
delete_unreachable_blocks ();
|
||||||
|
|
||||||
/* Mark critical edges. */
|
/* Mark critical edges. */
|
||||||
|
@ -2097,6 +2098,11 @@ free_basic_block_vars (keep_head_end_p)
|
||||||
clear_edges ();
|
clear_edges ();
|
||||||
VARRAY_FREE (basic_block_info);
|
VARRAY_FREE (basic_block_info);
|
||||||
n_basic_blocks = 0;
|
n_basic_blocks = 0;
|
||||||
|
|
||||||
|
ENTRY_BLOCK_PTR->aux = NULL;
|
||||||
|
ENTRY_BLOCK_PTR->global_live_at_end = NULL;
|
||||||
|
EXIT_BLOCK_PTR->aux = NULL;
|
||||||
|
EXIT_BLOCK_PTR->global_live_at_start = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2298,7 +2304,8 @@ life_analysis_1 (f, nregs)
|
||||||
/* Allocate and zero out many data structures
|
/* Allocate and zero out many data structures
|
||||||
that will record the data from lifetime analysis. */
|
that will record the data from lifetime analysis. */
|
||||||
|
|
||||||
allocate_for_life_analysis ();
|
allocate_reg_life_data ();
|
||||||
|
allocate_bb_life_data ();
|
||||||
|
|
||||||
reg_next_use = (rtx *) alloca (nregs * sizeof (rtx));
|
reg_next_use = (rtx *) alloca (nregs * sizeof (rtx));
|
||||||
memset (reg_next_use, 0, nregs * sizeof (rtx));
|
memset (reg_next_use, 0, nregs * sizeof (rtx));
|
||||||
|
@ -2511,21 +2518,10 @@ life_analysis_1 (f, nregs)
|
||||||
of life analysis. Not static since used also for stupid life analysis. */
|
of life analysis. Not static since used also for stupid life analysis. */
|
||||||
|
|
||||||
void
|
void
|
||||||
allocate_for_life_analysis ()
|
allocate_bb_life_data ()
|
||||||
{
|
{
|
||||||
register int i;
|
register int i;
|
||||||
|
|
||||||
/* Recalculate the register space, in case it has grown. Old style
|
|
||||||
vector oriented regsets would set regset_{size,bytes} here also. */
|
|
||||||
allocate_reg_info (max_regno, FALSE, FALSE);
|
|
||||||
|
|
||||||
/* Because both reg_scan and flow_analysis want to set up the REG_N_SETS
|
|
||||||
information, explicitly reset it here. The allocation should have
|
|
||||||
already happened on the previous reg_scan pass. Make sure in case
|
|
||||||
some more registers were allocated. */
|
|
||||||
for (i = 0; i < max_regno; i++)
|
|
||||||
REG_N_SETS (i) = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < n_basic_blocks; i++)
|
for (i = 0; i < n_basic_blocks; i++)
|
||||||
{
|
{
|
||||||
basic_block bb = BASIC_BLOCK (i);
|
basic_block bb = BASIC_BLOCK (i);
|
||||||
|
@ -2541,7 +2537,23 @@ allocate_for_life_analysis ()
|
||||||
= OBSTACK_ALLOC_REG_SET (function_obstack);
|
= OBSTACK_ALLOC_REG_SET (function_obstack);
|
||||||
|
|
||||||
regs_live_at_setjmp = OBSTACK_ALLOC_REG_SET (function_obstack);
|
regs_live_at_setjmp = OBSTACK_ALLOC_REG_SET (function_obstack);
|
||||||
CLEAR_REG_SET (regs_live_at_setjmp);
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
allocate_reg_life_data ()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Recalculate the register space, in case it has grown. Old style
|
||||||
|
vector oriented regsets would set regset_{size,bytes} here also. */
|
||||||
|
allocate_reg_info (max_regno, FALSE, FALSE);
|
||||||
|
|
||||||
|
/* Because both reg_scan and flow_analysis want to set up the REG_N_SETS
|
||||||
|
information, explicitly reset it here. The allocation should have
|
||||||
|
already happened on the previous reg_scan pass. Make sure in case
|
||||||
|
some more registers were allocated. */
|
||||||
|
for (i = 0; i < max_regno; i++)
|
||||||
|
REG_N_SETS (i) = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make each element of VECTOR point at a regset. The vector has
|
/* Make each element of VECTOR point at a regset. The vector has
|
||||||
|
|
|
@ -644,7 +644,7 @@ gcse_main (f, file)
|
||||||
/* Identify the basic block information for this function, including
|
/* Identify the basic block information for this function, including
|
||||||
successors and predecessors. */
|
successors and predecessors. */
|
||||||
max_gcse_regno = max_reg_num ();
|
max_gcse_regno = max_reg_num ();
|
||||||
find_basic_blocks (f, max_gcse_regno, file);
|
find_basic_blocks (f, max_gcse_regno, file, 1);
|
||||||
|
|
||||||
/* Return if there's nothing to do. */
|
/* Return if there's nothing to do. */
|
||||||
if (n_basic_blocks <= 1)
|
if (n_basic_blocks <= 1)
|
||||||
|
|
|
@ -128,7 +128,7 @@ extern void allocate_for_life_analysis PROTO((void));
|
||||||
extern int regno_uninitialized PROTO((int));
|
extern int regno_uninitialized PROTO((int));
|
||||||
extern int regno_clobbered_at_setjmp PROTO((int));
|
extern int regno_clobbered_at_setjmp PROTO((int));
|
||||||
extern void dump_flow_info PROTO((FILE *));
|
extern void dump_flow_info PROTO((FILE *));
|
||||||
extern void find_basic_blocks PROTO((rtx, int, FILE *));
|
extern void find_basic_blocks PROTO((rtx, int, FILE *, int));
|
||||||
extern void free_basic_block_vars PROTO((int));
|
extern void free_basic_block_vars PROTO((int));
|
||||||
extern void set_block_num PROTO((rtx, int));
|
extern void set_block_num PROTO((rtx, int));
|
||||||
extern void life_analysis PROTO((rtx, int, FILE *));
|
extern void life_analysis PROTO((rtx, int, FILE *));
|
||||||
|
|
|
@ -1438,7 +1438,8 @@ extern void stupid_life_analysis PROTO ((rtx, int, FILE *));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* In flow.c */
|
/* In flow.c */
|
||||||
extern void allocate_for_life_analysis PROTO ((void));
|
extern void allocate_bb_life_data PROTO ((void));
|
||||||
|
extern void allocate_reg_life_data PROTO ((void));
|
||||||
extern void recompute_reg_usage PROTO ((rtx, int));
|
extern void recompute_reg_usage PROTO ((rtx, int));
|
||||||
#ifdef BUFSIZ
|
#ifdef BUFSIZ
|
||||||
extern void dump_flow_info PROTO ((FILE *));
|
extern void dump_flow_info PROTO ((FILE *));
|
||||||
|
|
|
@ -253,7 +253,8 @@ stupid_life_analysis (f, nregs, file)
|
||||||
/* Allocate and zero out many data structures
|
/* Allocate and zero out many data structures
|
||||||
that will record the data from lifetime analysis. */
|
that will record the data from lifetime analysis. */
|
||||||
|
|
||||||
allocate_for_life_analysis ();
|
allocate_reg_life_data ();
|
||||||
|
allocate_bb_life_data ();
|
||||||
|
|
||||||
for (i = 0; i < max_regno; i++)
|
for (i = 0; i < max_regno; i++)
|
||||||
REG_N_DEATHS (i) = 1;
|
REG_N_DEATHS (i) = 1;
|
||||||
|
|
|
@ -3978,7 +3978,7 @@ rest_of_compilation (decl)
|
||||||
TIMEVAR
|
TIMEVAR
|
||||||
(flow_time,
|
(flow_time,
|
||||||
{
|
{
|
||||||
find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
|
find_basic_blocks (insns, max_reg_num (), rtl_dump_file, 1);
|
||||||
life_analysis (insns, max_reg_num (), rtl_dump_file);
|
life_analysis (insns, max_reg_num (), rtl_dump_file);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -4152,7 +4152,7 @@ rest_of_compilation (decl)
|
||||||
TIMEVAR
|
TIMEVAR
|
||||||
(flow2_time,
|
(flow2_time,
|
||||||
{
|
{
|
||||||
find_basic_blocks (insns, max_reg_num (), rtl_dump_file);
|
find_basic_blocks (insns, max_reg_num (), rtl_dump_file, 1);
|
||||||
life_analysis (insns, max_reg_num (), rtl_dump_file);
|
life_analysis (insns, max_reg_num (), rtl_dump_file);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue