diff options
author | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-09-19 18:19:39 +0000 |
---|---|---|
committer | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-09-19 18:19:39 +0000 |
commit | e56043cd2c207982e812ce6fcecb7353dea58363 (patch) | |
tree | 01a6f37ad5a9ae6b18bdc20f052b04e19b4255c0 /gcc/domwalk.c | |
parent | 2e02a1a4548f2ee1ea519c88e68b20621ad16fcc (diff) | |
download | gcc-e56043cd2c207982e812ce6fcecb7353dea58363.tar.gz |
2010-09-19 Basile Starynkevitch <basile@starynkevitch.net>
MELT branch merged with trunk rev 164348, with some improvements
in gcc/melt-runtime.[ch]
2010-09-19 Basile Starynkevitch <basile@starynkevitch.net>
[[merged with trunk rev.164348, so improved MELT runtime!]]
* gcc/melt-runtime.h: improved comments.
(melt_debug_garbcoll, melt_debuggc_eprintf): Moved from melt-runtime.c.
(melt_obmag_string): New declaration.
(struct meltobject_st, struct meltclosure_st, struct
meltroutine_st, struct meltmixbigint_st, struct meltstring_st):
using GTY variable_size and @@MELTGTY@@ comment.
(melt_mark_special): added debug print.
* gcc/melt-runtime.c: Improved comments.
Include bversion.h, realmpfr.h, gimple-pretty-print.h.
(ggc_force_collect) Declared external.
(melt_forward_counter): Added.
(melt_obmag_string): New function.
(melt_alptr_1, melt_alptr_2, melt_break_alptr_1_at)
(melt_break_alptr_2_at, melt_break_alptr_1,melt_break_alptr_1)
(melt_allocate_young_gc_zone, melt_free_young_gc_zone): New.
(delete_special, meltgc_make_special): Improved debug printf and
use melt_break_alptr_1...
(ggc_alloc_*) macros defined for backport to GCC 4.5
(melt_forwarded_copy): Don't clear the new destination zone in old
GGC heap.
(meltgc_add_out_raw_len): Use ggc_alloc_atomic.
(meltgc_raw_new_mappointers, meltgc_raw_put_mappointers)
(meltgc_raw_remove_mappointers): Corrected length argument to
ggc_alloc_cleared_vec_entrypointermelt_st.
(melt_really_initialize): Call melt_allocate_young_gc_zone.
(melt_initialize): Set flag_plugin_added.
(melt_val2passflag): TODO_verify_loops only in GCC 4.5
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/melt-branch@164424 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/domwalk.c')
-rw-r--r-- | gcc/domwalk.c | 42 |
1 files changed, 40 insertions, 2 deletions
diff --git a/gcc/domwalk.c b/gcc/domwalk.c index 07764eb8047..89d2e469eed 100644 --- a/gcc/domwalk.c +++ b/gcc/domwalk.c @@ -25,7 +25,7 @@ along with GCC; see the file COPYING3. If not see #include "tm.h" #include "basic-block.h" #include "domwalk.h" -#include "ggc.h" +#include "sbitmap.h" /* This file implements a generic walker for dominator trees. @@ -144,6 +144,9 @@ walk_dominator_tree (struct dom_walk_data *walk_data, basic_block bb) basic_block dest; basic_block *worklist = XNEWVEC (basic_block, n_basic_blocks * 2); int sp = 0; + sbitmap visited = sbitmap_alloc (last_basic_block + 1); + sbitmap_zero (visited); + SET_BIT (visited, ENTRY_BLOCK_PTR->index); while (true) { @@ -184,6 +187,8 @@ walk_dominator_tree (struct dom_walk_data *walk_data, basic_block bb) if (walk_data->before_dom_children) (*walk_data->before_dom_children) (walk_data, bb); + SET_BIT (visited, bb->index); + /* Mark the current BB to be popped out of the recursion stack once children are processed. */ worklist[sp++] = bb; @@ -213,11 +218,44 @@ walk_dominator_tree (struct dom_walk_data *walk_data, basic_block bb) } } if (sp) - bb = worklist[--sp]; + { + int spp; + spp = sp - 1; + if (walk_data->dom_direction == CDI_DOMINATORS) + /* Find the dominator son that has all its predecessors + visited and continue with that. */ + while (1) + { + edge_iterator ei; + edge e; + bool found = true; + bb = worklist[spp]; + FOR_EACH_EDGE (e, ei, bb->preds) + { + if (!dominated_by_p (CDI_DOMINATORS, e->src, e->dest) + && !TEST_BIT (visited, e->src->index)) + { + found = false; + break; + } + } + if (found) + break; + /* If we didn't find a dom child with all visited + predecessors just use the candidate we were checking. + This happens for candidates in irreducible loops. */ + if (!worklist[spp - 1]) + break; + --spp; + } + bb = worklist[spp]; + worklist[spp] = worklist[--sp]; + } else break; } free (worklist); + sbitmap_free (visited); } void |