This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
condexec merge part 2
- To: gcc-patches at gcc dot gnu dot org
- Subject: condexec merge part 2
- From: Richard Henderson <rth at cygnus dot com>
- Date: Wed, 26 Apr 2000 21:44:30 -0700
Change life_analysis to take PROP_* flags like the other functions
in that family. This should also cure the SSA bugs seen on ARM due
to being premature with the autoinc optimizations.
r~
* basic-block.h (life_analysis): Declare here ...
* output.h: ... not here.
* flow.c (life_analysis): Remove nregs parameter; replace
remove_dead_code with flags. Remove ssa dead code check.
Only init alias analysis if we'll use it.
* reg-stack.c (reg_to_stack): Update life_analysis arguments.
* ssa.c (convert_to_ssa): Likewise.
(convert_from_ssa): Likewise.
* toplev.c (rest_of_compilation): Likewise.
Index: basic-block.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/basic-block.h,v
retrieving revision 1.63
diff -c -p -d -r1.63 basic-block.h
*** basic-block.h 2000/04/27 04:26:47 1.63
--- basic-block.h 2000/04/27 04:38:35
*************** enum update_life_extent
*** 427,432 ****
--- 427,433 ----
#define PROP_AUTOINC 32 /* Create autoinc mem references. */
#define PROP_FINAL 63 /* All of the above. */
+ extern void life_analysis PARAMS ((rtx, FILE *, int));
extern void update_life_info PARAMS ((sbitmap, enum update_life_extent,
int));
extern int count_or_remove_death_notes PARAMS ((sbitmap, int));
Index: flow.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/flow.c,v
retrieving revision 1.257
diff -c -p -d -r1.257 flow.c
*** flow.c 2000/04/27 04:26:47 1.257
--- flow.c 2000/04/27 04:38:36
*************** calculate_loop_depth (dump)
*** 2491,2522 ****
}
/* Perform data flow analysis.
! F is the first insn of the function and NREGS the number of register numbers
! in use. */
void
! life_analysis (f, nregs, file, remove_dead_code)
rtx f;
- int nregs;
FILE *file;
! int remove_dead_code;
{
#ifdef ELIMINABLE_REGS
register int i;
static struct {int from, to; } eliminables[] = ELIMINABLE_REGS;
#endif
- int flags;
sbitmap all_blocks;
- /* Dead code elimination changes basic block structure and therefore
- breaks the SSA phi representation. Particularly, a phi node
- can have an alternative value for each incoming block, referenced
- by the block number. Removing dead code can bump entire blocks
- and therefore cause blocks to be renumbered, invalidating the
- numbering of phi alternatives. */
- if (remove_dead_code && in_ssa_form)
- abort ();
-
/* Record which registers will be eliminated. We use this in
mark_used_regs. */
--- 2491,2511 ----
}
/* Perform data flow analysis.
! F is the first insn of the function; FLAGS is a set of PROP_* flags
! to be used in accumulating flow info. */
void
! life_analysis (f, file, flags)
rtx f;
FILE *file;
! int flags;
{
#ifdef ELIMINABLE_REGS
register int i;
static struct {int from, to; } eliminables[] = ELIMINABLE_REGS;
#endif
sbitmap all_blocks;
/* Record which registers will be eliminated. We use this in
mark_used_regs. */
*************** life_analysis (f, nregs, file, remove_de
*** 2529,2545 ****
SET_HARD_REG_BIT (elim_reg_set, FRAME_POINTER_REGNUM);
#endif
- /* We want alias analysis information for local dead store elimination. */
- init_alias_analysis ();
-
if (! optimize)
! flags = PROP_DEATH_NOTES | PROP_REG_INFO;
! else
! {
! flags = PROP_FINAL;
! if (! remove_dead_code)
! flags &= ~(PROP_SCAN_DEAD_CODE | PROP_KILL_DEAD_CODE);
! }
/* The post-reload life analysis have (on a global basis) the same
registers live as was computed by reload itself. elimination
--- 2518,2525 ----
SET_HARD_REG_BIT (elim_reg_set, FRAME_POINTER_REGNUM);
#endif
if (! optimize)
! flags &= PROP_DEATH_NOTES | PROP_REG_INFO;
/* The post-reload life analysis have (on a global basis) the same
registers live as was computed by reload itself. elimination
*************** life_analysis (f, nregs, file, remove_de
*** 2550,2556 ****
if (reload_completed)
flags &= ~PROP_REG_INFO;
! max_regno = nregs;
/* Always remove no-op moves. Do this before other processing so
that we don't have to keep re-scanning them. */
--- 2530,2540 ----
if (reload_completed)
flags &= ~PROP_REG_INFO;
! /* We want alias analysis information for local dead store elimination. */
! if (flags & PROP_SCAN_DEAD_CODE)
! init_alias_analysis ();
!
! max_regno = max_reg_num ();
/* Always remove no-op moves. Do this before other processing so
that we don't have to keep re-scanning them. */
*************** life_analysis (f, nregs, file, remove_de
*** 2582,2588 ****
/* Clean up. */
sbitmap_free (all_blocks);
! end_alias_analysis ();
if (file)
dump_flow_info (file);
--- 2566,2574 ----
/* Clean up. */
sbitmap_free (all_blocks);
!
! if (flags & PROP_SCAN_DEAD_CODE)
! end_alias_analysis ();
if (file)
dump_flow_info (file);
Index: output.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/output.h,v
retrieving revision 1.45
diff -c -p -d -r1.45 output.h
*** output.h 2000/03/09 19:01:47 1.45
--- output.h 2000/04/27 04:38:36
*************** extern void cleanup_cfg PARAMS ((rtx))
*** 137,143 ****
extern void calculate_loop_depth PARAMS ((FILE *));
extern void free_basic_block_vars PARAMS ((int));
extern void set_block_num PARAMS ((rtx, int));
- extern void life_analysis PARAMS ((rtx, int, FILE *, int));
#endif
/* Functions in varasm.c. */
--- 137,142 ----
Index: reg-stack.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/reg-stack.c,v
retrieving revision 1.58
diff -c -p -d -r1.58 reg-stack.c
*** reg-stack.c 2000/04/26 00:43:09 1.58
--- reg-stack.c 2000/04/27 04:38:36
*************** reg_to_stack (first, file)
*** 435,441 ****
build the CFG and run life analysis. */
find_basic_blocks (first, max_reg_num (), file);
count_or_remove_death_notes (NULL, 1);
! life_analysis (first, max_reg_num (), file, 0);
/* Set up block info for each basic block. */
bi = (block_info) xcalloc ((n_basic_blocks + 1), sizeof (*bi));
--- 435,441 ----
build the CFG and run life analysis. */
find_basic_blocks (first, max_reg_num (), file);
count_or_remove_death_notes (NULL, 1);
! life_analysis (first, file, PROP_DEATH_NOTES);
/* Set up block info for each basic block. */
bi = (block_info) xcalloc ((n_basic_blocks + 1), sizeof (*bi));
Index: ssa.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/ssa.c,v
retrieving revision 1.8
diff -c -p -d -r1.8 ssa.c
*** ssa.c 2000/04/09 01:16:44 1.8
--- ssa.c 2000/04/27 04:38:36
*************** convert_to_ssa()
*** 855,861 ****
if (in_ssa_form)
abort ();
! life_analysis (get_insns (), max_reg_num (), NULL, 1);
/* Compute dominators. */
dominators = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
--- 855,861 ----
if (in_ssa_form)
abort ();
! life_analysis (get_insns (), NULL, PROP_KILL_DEAD_CODE | PROP_SCAN_DEAD_CODE);
/* Compute dominators. */
dominators = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
*************** convert_from_ssa()
*** 1812,1818 ****
/* We need up-to-date life information. */
compute_bb_for_insn (get_max_uid ());
! life_analysis (insns, max_reg_num (), NULL, 0);
/* Figure out which regs in copies and phi nodes don't conflict and
therefore can be coalesced. */
--- 1812,1818 ----
/* We need up-to-date life information. */
compute_bb_for_insn (get_max_uid ());
! life_analysis (insns, NULL, PROP_KILL_DEAD_CODE | PROP_SCAN_DEAD_CODE);
/* Figure out which regs in copies and phi nodes don't conflict and
therefore can be coalesced. */
Index: toplev.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/toplev.c,v
retrieving revision 1.323
diff -c -p -d -r1.323 toplev.c
*** toplev.c 2000/04/26 00:36:55 1.323
--- toplev.c 2000/04/27 04:38:36
*************** rest_of_compilation (decl)
*** 3247,3253 ****
cleanup_cfg (insns);
if (optimize)
calculate_loop_depth (rtl_dump_file);
! life_analysis (insns, max_reg_num (), rtl_dump_file, 1);
mark_constant_function ();
});
--- 3247,3253 ----
cleanup_cfg (insns);
if (optimize)
calculate_loop_depth (rtl_dump_file);
! life_analysis (insns, rtl_dump_file, PROP_FINAL);
mark_constant_function ();
});
*************** rest_of_compilation (decl)
*** 3434,3440 ****
TIMEVAR (flow2_time,
{
cleanup_cfg (insns);
! life_analysis (insns, max_reg_num (), rtl_dump_file, 1);
});
/* This is kind of heruistics. We need to run combine_stack_adjustments
--- 3434,3440 ----
TIMEVAR (flow2_time,
{
cleanup_cfg (insns);
! life_analysis (insns, rtl_dump_file, PROP_FINAL);
});
/* This is kind of heruistics. We need to run combine_stack_adjustments