Commit 11f68165 by John Wehle Committed by John Wehle

basic-block.h (PROP_ALLOW_CFG_CHANGES): Define.

	* basic-block.h (PROP_ALLOW_CFG_CHANGES): Define.
	(PROP_FINAL): Include PROP_ALLOW_CFG_CHANGES.
	(propagate_block): Update prototype.
	* flow.c (update_life_info): Simplify the CFG and
	recalculate the global regs which are alive when
	removing dead code during a global update.
	(propagate_block): Return non-zero if an INSN is
	deleted.

From-SVN: r44403
parent 62c62a4f
Thu Jul 26 14:04:03 EDT 2001 John Wehle (john@feith.com)
* basic-block.h (PROP_ALLOW_CFG_CHANGES): Define.
(PROP_FINAL): Include PROP_ALLOW_CFG_CHANGES.
(propagate_block): Update prototype.
* flow.c (update_life_info): Simplify the CFG and
recalculate the global regs which are alive when
removing dead code during a global update.
(propagate_block): Return non-zero if an INSN is
deleted.
2001-07-26 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> 2001-07-26 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
* Makefile.in (LIBICONV): Define. * Makefile.in (LIBICONV): Define.
......
...@@ -533,8 +533,10 @@ enum update_life_extent ...@@ -533,8 +533,10 @@ enum update_life_extent
#define PROP_REG_INFO 4 /* Update regs_ever_live et al. */ #define PROP_REG_INFO 4 /* Update regs_ever_live et al. */
#define PROP_KILL_DEAD_CODE 8 /* Remove dead code. */ #define PROP_KILL_DEAD_CODE 8 /* Remove dead code. */
#define PROP_SCAN_DEAD_CODE 16 /* Scan for dead code. */ #define PROP_SCAN_DEAD_CODE 16 /* Scan for dead code. */
#define PROP_AUTOINC 32 /* Create autoinc mem references. */ #define PROP_ALLOW_CFG_CHANGES 32 /* Allow the CFG to be changed
#define PROP_FINAL 63 /* All of the above. */ by dead code removal. */
#define PROP_AUTOINC 64 /* Create autoinc mem references. */
#define PROP_FINAL 127 /* All of the above. */
#define CLEANUP_EXPENSIVE 1 /* Do relativly expensive optimizations #define CLEANUP_EXPENSIVE 1 /* Do relativly expensive optimizations
except for edge forwarding */ except for edge forwarding */
...@@ -557,7 +559,7 @@ extern void life_analysis PARAMS ((rtx, FILE *, int)); ...@@ -557,7 +559,7 @@ extern void life_analysis PARAMS ((rtx, FILE *, int));
extern void update_life_info PARAMS ((sbitmap, enum update_life_extent, extern void update_life_info PARAMS ((sbitmap, enum update_life_extent,
int)); int));
extern int count_or_remove_death_notes PARAMS ((sbitmap, int)); extern int count_or_remove_death_notes PARAMS ((sbitmap, int));
extern void propagate_block PARAMS ((basic_block, regset, regset, regset, extern int propagate_block PARAMS ((basic_block, regset, regset, regset,
int)); int));
struct propagate_block_info; struct propagate_block_info;
......
...@@ -4209,11 +4209,45 @@ update_life_info (blocks, extent, prop_flags) ...@@ -4209,11 +4209,45 @@ update_life_info (blocks, extent, prop_flags)
tmp = INITIALIZE_REG_SET (tmp_head); tmp = INITIALIZE_REG_SET (tmp_head);
/* Changes to the CFG are only allowed when
doing a global update for the entire CFG. */
if ((prop_flags & PROP_ALLOW_CFG_CHANGES)
&& (extent == UPDATE_LIFE_LOCAL || blocks))
abort ();
/* For a global update, we go through the relaxation process again. */ /* For a global update, we go through the relaxation process again. */
if (extent != UPDATE_LIFE_LOCAL) if (extent != UPDATE_LIFE_LOCAL)
{ {
calculate_global_regs_live (blocks, blocks, for ( ; ; )
prop_flags & PROP_SCAN_DEAD_CODE); {
int changed = 0;
calculate_global_regs_live (blocks, blocks,
prop_flags & (PROP_SCAN_DEAD_CODE
| PROP_ALLOW_CFG_CHANGES));
if ((prop_flags & (PROP_KILL_DEAD_CODE | PROP_ALLOW_CFG_CHANGES))
!= (PROP_KILL_DEAD_CODE | PROP_ALLOW_CFG_CHANGES))
break;
/* Removing dead code may allow the CFG to be simplified which
in turn may allow for further dead code detection / removal. */
for (i = n_basic_blocks - 1; i >= 0; --i)
{
basic_block bb = BASIC_BLOCK (i);
COPY_REG_SET (tmp, bb->global_live_at_end);
changed |= propagate_block (bb, tmp, NULL, NULL,
prop_flags & (PROP_SCAN_DEAD_CODE
| PROP_KILL_DEAD_CODE));
}
if (! changed || ! try_optimize_cfg (CLEANUP_EXPENSIVE))
break;
delete_unreachable_blocks ();
mark_critical_edges ();
}
/* If asked, remove notes from the blocks we'll update. */ /* If asked, remove notes from the blocks we'll update. */
if (extent == UPDATE_LIFE_GLOBAL_RM_NOTES) if (extent == UPDATE_LIFE_GLOBAL_RM_NOTES)
...@@ -5365,9 +5399,11 @@ free_propagate_block_info (pbi) ...@@ -5365,9 +5399,11 @@ free_propagate_block_info (pbi)
and cleared in COND_LOCAL_SET. and cleared in COND_LOCAL_SET.
It is valid for LOCAL_SET and COND_LOCAL_SET to be the same set. In this It is valid for LOCAL_SET and COND_LOCAL_SET to be the same set. In this
case, the resulting set will be equal to the union of the two sets that case, the resulting set will be equal to the union of the two sets that
would otherwise be computed. */ would otherwise be computed.
void Return non-zero if an INSN is deleted (i.e. by dead code removal). */
int
propagate_block (bb, live, local_set, cond_local_set, flags) propagate_block (bb, live, local_set, cond_local_set, flags)
basic_block bb; basic_block bb;
regset live; regset live;
...@@ -5377,6 +5413,7 @@ propagate_block (bb, live, local_set, cond_local_set, flags) ...@@ -5377,6 +5413,7 @@ propagate_block (bb, live, local_set, cond_local_set, flags)
{ {
struct propagate_block_info *pbi; struct propagate_block_info *pbi;
rtx insn, prev; rtx insn, prev;
int changed;
pbi = init_propagate_block_info (bb, live, local_set, cond_local_set, flags); pbi = init_propagate_block_info (bb, live, local_set, cond_local_set, flags);
...@@ -5392,6 +5429,7 @@ propagate_block (bb, live, local_set, cond_local_set, flags) ...@@ -5392,6 +5429,7 @@ propagate_block (bb, live, local_set, cond_local_set, flags)
/* Scan the block an insn at a time from end to beginning. */ /* Scan the block an insn at a time from end to beginning. */
changed = 0;
for (insn = bb->end;; insn = prev) for (insn = bb->end;; insn = prev)
{ {
/* If this is a call to `setjmp' et al, warn if any /* If this is a call to `setjmp' et al, warn if any
...@@ -5402,12 +5440,15 @@ propagate_block (bb, live, local_set, cond_local_set, flags) ...@@ -5402,12 +5440,15 @@ propagate_block (bb, live, local_set, cond_local_set, flags)
IOR_REG_SET (regs_live_at_setjmp, pbi->reg_live); IOR_REG_SET (regs_live_at_setjmp, pbi->reg_live);
prev = propagate_one_insn (pbi, insn); prev = propagate_one_insn (pbi, insn);
changed |= NEXT_INSN (prev) != insn;
if (insn == bb->head) if (insn == bb->head)
break; break;
} }
free_propagate_block_info (pbi); free_propagate_block_info (pbi);
return changed;
} }
/* Return 1 if X (the body of an insn, or part of it) is just dead stores /* Return 1 if X (the body of an insn, or part of it) is just dead stores
......
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