projects
/
libfirm
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
5b290ce
)
-BugFix: exp_gen sets must be cleaned
author
Michael Beck
<beck@ipd.info.uni-karlsruhe.de>
Wed, 9 Jul 2008 02:08:04 +0000
(
02:08
+0000)
committer
Michael Beck
<beck@ipd.info.uni-karlsruhe.de>
Wed, 9 Jul 2008 02:08:04 +0000
(
02:08
+0000)
[r20382]
ir/opt/gvn_pre.c
patch
|
blob
|
history
diff --git
a/ir/opt/gvn_pre.c
b/ir/opt/gvn_pre.c
index
a9498d8
..
811b7f0
100644
(file)
--- a/
ir/opt/gvn_pre.c
+++ b/
ir/opt/gvn_pre.c
@@
-723,15
+723,15
@@
static void eliminate_nodes(elim_pair *pairs) {
*/
void do_gvn_pre(ir_graph *irg)
{
*/
void do_gvn_pre(ir_graph *irg)
{
- struct obstack obst;
- pre_env a_env;
+ struct obstack
obst;
+ pre_env
a_env;
optimization_state_t state;
optimization_state_t state;
- block_info *bl_info;
- unsigned antic_iter, insert_iter;
+ block_info *bl_info;
+ unsigned antic_iter, insert_iter;
+ ir_node *value, *expr;
/* register a debug mask */
FIRM_DBG_REGISTER(dbg, "firm.opt.gvn_pre");
/* register a debug mask */
FIRM_DBG_REGISTER(dbg, "firm.opt.gvn_pre");
- firm_dbg_set_mask(dbg, SET_LEVEL_2);
/* edges will crash if enabled due to our allocate on other obstack trick */
edges_deactivate(irg);
/* edges will crash if enabled due to our allocate on other obstack trick */
edges_deactivate(irg);
@@
-771,6
+771,16
@@
void do_gvn_pre(ir_graph *irg)
/* allocate block info for all blocks */
irg_walk_blkwise_graph(irg, NULL, topo_walker, &a_env);
/* allocate block info for all blocks */
irg_walk_blkwise_graph(irg, NULL, topo_walker, &a_env);
+ /* clean the exp_gen set. Doing this here saves the cleanup in the iteration. */
+ for (bl_info = a_env.list; bl_info != NULL; bl_info = bl_info->next) {
+ ir_valueset_iterator_t iter;
+
+ foreach_valueset(bl_info->exp_gen, value, expr, iter) {
+ if (!is_clean(expr))
+ ir_valueset_remove_iterator(bl_info->exp_gen, &iter);
+ }
+ }
+
/* compute the available value sets for all blocks */
dom_tree_walk_irg(irg, compute_avail_top_down, NULL, &a_env);
/* compute the available value sets for all blocks */
dom_tree_walk_irg(irg, compute_avail_top_down, NULL, &a_env);
@@
-783,7
+793,6
@@
void do_gvn_pre(ir_graph *irg)
do {
DB((dbg, LEVEL_1, "Antic_in Iteration %d starts ...\n", ++antic_iter));
a_env.changes = 0;
do {
DB((dbg, LEVEL_1, "Antic_in Iteration %d starts ...\n", ++antic_iter));
a_env.changes = 0;
- //irg_block_walk_graph(irg, compute_antic, NULL, &a_env);
postdom_tree_walk_irg(irg, compute_antic, NULL, &a_env);
a_env.first_iter = 0;
DB((dbg, LEVEL_1, "------------------------\n"));
postdom_tree_walk_irg(irg, compute_antic, NULL, &a_env);
a_env.first_iter = 0;
DB((dbg, LEVEL_1, "------------------------\n"));