aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2001-10-29 12:45:45 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2001-10-29 11:45:45 +0000
commit473fb060f3609f51fc4e1711297f3600e15ed7c0 (patch)
tree91cc2113797ecc74514f6de4826f7f7c19e0e549
parent4fdaa8786fe048b12597a2055370044e16a37e1f (diff)
downloadgcc-473fb060f3609f51fc4e1711297f3600e15ed7c0.zip
gcc-473fb060f3609f51fc4e1711297f3600e15ed7c0.tar.gz
gcc-473fb060f3609f51fc4e1711297f3600e15ed7c0.tar.bz2
basic-block.h (purge_all_dead_edges): Add update_life_p argument.
* basic-block.h (purge_all_dead_edges): Add update_life_p argument. * cfgcleanup.c (merge_blocks): Update the life flag after merging; fix warning. * cfgrtl.c (purge_all_dead_edges): Allow updating of liveness. (life_analysis): call purge_all_dead_edges after deleting noops. (delete_noop_move): Do not purge CFG. * toplev.c (rest_of_compilation): Update purge_all_dead_edges call. From-SVN: r46605
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/basic-block.h2
-rw-r--r--gcc/cfgcleanup.c8
-rw-r--r--gcc/cfgrtl.c24
-rw-r--r--gcc/flow.c3
-rw-r--r--gcc/toplev.c2
6 files changed, 42 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a97d1d2..2dd564a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+Mon Oct 29 12:43:06 CET 2001 Jan Hubicka <jh@suse.cz>
+
+ * basic-block.h (purge_all_dead_edges): Add update_life_p argument.
+ * cfgcleanup.c (merge_blocks): Update the life flag after merging;
+ fix warning.
+ * cfgrtl.c (purge_all_dead_edges): Allow updating of liveness.
+ (life_analysis): call purge_all_dead_edges after deleting noops.
+ (delete_noop_move): Do not purge CFG.
+ * toplev.c (rest_of_compilation): Update purge_all_dead_edges call.
+
2001-10-28 David Edelsohn <edelsohn@gnu.org>
* config/rs6000/aix31.h (ASM_OUTPUT_EXTERNAL): Use assemble_name.
diff --git a/gcc/basic-block.h b/gcc/basic-block.h
index 6430230..4eba1e4 100644
--- a/gcc/basic-block.h
+++ b/gcc/basic-block.h
@@ -638,7 +638,7 @@ extern basic_block force_nonfallthru PARAMS ((edge));
extern bool redirect_edge_and_branch PARAMS ((edge, basic_block));
extern rtx block_label PARAMS ((basic_block));
extern bool forwarder_block_p PARAMS ((basic_block));
-extern bool purge_all_dead_edges PARAMS ((void));
+extern bool purge_all_dead_edges PARAMS ((bool));
extern bool purge_dead_edges PARAMS ((basic_block));
extern void find_sub_basic_blocks PARAMS ((basic_block));
extern void find_many_sub_basic_blocks PARAMS ((sbitmap));
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index bd5a3ed..6919e0f 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -433,6 +433,12 @@ merge_blocks (e, b, c, mode)
/* If B has a fallthru edge to C, no need to move anything. */
if (e->flags & EDGE_FALLTHRU)
{
+ /* We need to update liveness in case C already has broken liveness
+ or B ends by conditional jump to next instructions that will be
+ removed. */
+ if ((BB_FLAGS (c) & BB_UPDATE_LIFE)
+ || GET_CODE (b->end) == JUMP_INSN)
+ BB_SET_FLAG (b, BB_UPDATE_LIFE);
merge_blocks_nomove (b, c);
update_forwarder_flag (b);
@@ -490,7 +496,7 @@ merge_blocks (e, b, c, mode)
if (b_has_incoming_fallthru)
{
- rtx bb;
+ basic_block bb;
if (b_fallthru_edge->src == ENTRY_BLOCK_PTR)
return false;
bb = force_nonfallthru (b_fallthru_edge);
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index 6abac76..16fca39 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -1923,10 +1923,30 @@ purge_dead_edges (bb)
*/
bool
-purge_all_dead_edges ()
+purge_all_dead_edges (update_life_p)
+ bool update_life_p;
{
int i, purged = false;
+ sbitmap blocks;
+
+ if (update_life_p)
+ {
+ blocks = sbitmap_alloc (n_basic_blocks);
+ sbitmap_zero (blocks);
+ }
for (i = 0; i < n_basic_blocks; i++)
- purged |= purge_dead_edges (BASIC_BLOCK (i));
+ {
+ bool purged_here;
+ purged_here = purge_dead_edges (BASIC_BLOCK (i));
+ purged |= purged_here;
+ if (purged_here && update_life_p)
+ SET_BIT (blocks, i);
+ }
+ if (update_life_p && purged)
+ update_life_info (blocks, UPDATE_LIFE_GLOBAL,
+ PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE
+ | PROP_KILL_DEAD_CODE);
+ if (update_life_p)
+ sbitmap_free (blocks);
return purged;
}
diff --git a/gcc/flow.c b/gcc/flow.c
index a58cf51..50e7494 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -456,6 +456,7 @@ life_analysis (f, file, flags)
/* Always remove no-op moves. Do this before other processing so
that we don't have to keep re-scanning them. */
delete_noop_moves (f);
+ purge_all_dead_edges (false);
/* Some targets can emit simpler epilogues if they know that sp was
not ever modified during the function. After reload, of course,
@@ -803,8 +804,6 @@ delete_noop_moves (f)
PUT_CODE (insn, NOTE);
NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
NOTE_SOURCE_FILE (insn) = 0;
- if (insn == bb->end)
- purge_dead_edges (bb);
}
}
}
diff --git a/gcc/toplev.c b/gcc/toplev.c
index cd7fc11..e8184aa 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -3301,7 +3301,7 @@ rest_of_compilation (decl)
/* Always purge dead edges, as we may eliminate an insn throwing
exception. */
- rebuild_jump_labels_after_combine |= purge_all_dead_edges ();
+ rebuild_jump_labels_after_combine |= purge_all_dead_edges (true);
/* Combining insns may have turned an indirect jump into a
direct jump. Rebuid the JUMP_LABEL fields of jumping