Commit d71e2a26 authored by Michael Beck's avatar Michael Beck
Browse files

BugFix:

 - finally using edges to handle the use-counts rights

[r7931]
parent bde37e46
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#include "irflag_t.h" #include "irflag_t.h"
#include "array.h" #include "array.h"
#include "irhooks.h" #include "irhooks.h"
#include "iredges.h"
#include "irtools.h" #include "irtools.h"
#include "opt_polymorphy.h" #include "opt_polymorphy.h"
...@@ -169,9 +170,7 @@ static unsigned update_exc(ldst_info_t *info, ir_node *block, int pos) ...@@ -169,9 +170,7 @@ static unsigned update_exc(ldst_info_t *info, ir_node *block, int pos)
} }
/** Return the number of uses of an address node */ /** Return the number of uses of an address node */
#define get_irn_n_uses(adr) (unsigned)PTR_TO_INT(get_irn_link(adr)) #define get_irn_n_uses(adr) get_irn_n_edges(adr)
/** Sets the number of uses of an address node */
#define set_irn_n_uses(adr, n) set_irn_link(adr, INT_TO_PTR(n))
/** /**
* walker, collects all Load/Store/Proj nodes * walker, collects all Load/Store/Proj nodes
...@@ -199,8 +198,6 @@ static void collect_nodes(ir_node *node, void *env) ...@@ -199,8 +198,6 @@ static void collect_nodes(ir_node *node, void *env)
if ((ldst_info->flags & LDST_VISITED) == 0) { if ((ldst_info->flags & LDST_VISITED) == 0) {
adr = get_Load_ptr(pred); adr = get_Load_ptr(pred);
set_irn_n_uses(adr, get_irn_n_uses(adr) + 1);
ldst_info->flags |= LDST_VISITED; ldst_info->flags |= LDST_VISITED;
} }
...@@ -224,8 +221,6 @@ static void collect_nodes(ir_node *node, void *env) ...@@ -224,8 +221,6 @@ static void collect_nodes(ir_node *node, void *env)
if ((ldst_info->flags & LDST_VISITED) == 0) { if ((ldst_info->flags & LDST_VISITED) == 0) {
adr = get_Store_ptr(pred); adr = get_Store_ptr(pred);
set_irn_n_uses(adr, get_irn_n_uses(adr) + 1);
ldst_info->flags |= LDST_VISITED; ldst_info->flags |= LDST_VISITED;
} }
...@@ -412,6 +407,7 @@ static void handle_load_update(ir_node *load) { ...@@ -412,6 +407,7 @@ static void handle_load_update(ir_node *load) {
/* a Load which value is neither used nor exception checked, remove it */ /* a Load which value is neither used nor exception checked, remove it */
exchange(info->projs[pn_Load_M], mem); exchange(info->projs[pn_Load_M], mem);
exchange(load, new_Bad());
reduce_adr_usage(ptr); reduce_adr_usage(ptr);
} }
} }
...@@ -421,14 +417,9 @@ static void handle_load_update(ir_node *load) { ...@@ -421,14 +417,9 @@ static void handle_load_update(ir_node *load) {
* node and update the counters. * node and update the counters.
*/ */
static void reduce_adr_usage(ir_node *ptr) { static void reduce_adr_usage(ir_node *ptr) {
int use_count = get_irn_n_uses(ptr);
--use_count;
assert(use_count >= 0);
set_irn_n_uses(ptr, use_count);
if (is_Proj(ptr)) { if (is_Proj(ptr)) {
if (use_count <= 0) { if (get_irn_n_edges(ptr) <= 0) {
/* this Proj is now dead, update the Load/Store info */ /* this Proj is dead now */
ir_node *pred = get_Proj_pred(ptr); ir_node *pred = get_Proj_pred(ptr);
opcode code = get_irn_opcode(pred); opcode code = get_irn_opcode(pred);
...@@ -501,6 +492,7 @@ static unsigned follow_Load_chain(ir_node *load, ir_node *curr) { ...@@ -501,6 +492,7 @@ static unsigned follow_Load_chain(ir_node *load, ir_node *curr) {
if (info->projs[pn_Load_res]) if (info->projs[pn_Load_res])
exchange(info->projs[pn_Load_res], value); exchange(info->projs[pn_Load_res], value);
exchange(load, new_Bad());
reduce_adr_usage(ptr); reduce_adr_usage(ptr);
return res | DF_CHANGED; return res | DF_CHANGED;
} }
...@@ -546,6 +538,7 @@ static unsigned follow_Load_chain(ir_node *load, ir_node *curr) { ...@@ -546,6 +538,7 @@ static unsigned follow_Load_chain(ir_node *load, ir_node *curr) {
res |= CF_CHANGED; res |= CF_CHANGED;
} }
exchange(load, new_Bad());
reduce_adr_usage(ptr); reduce_adr_usage(ptr);
return res |= DF_CHANGED; return res |= DF_CHANGED;
} }
...@@ -641,6 +634,7 @@ static unsigned optimize_load(ir_node *load) ...@@ -641,6 +634,7 @@ static unsigned optimize_load(ir_node *load)
/* a Load which value is neither used nor exception checked, remove it */ /* a Load which value is neither used nor exception checked, remove it */
exchange(info->projs[pn_Load_M], mem); exchange(info->projs[pn_Load_M], mem);
exchange(load, new_Bad());
reduce_adr_usage(ptr); reduce_adr_usage(ptr);
return res | DF_CHANGED; return res | DF_CHANGED;
} }
...@@ -660,6 +654,7 @@ static unsigned optimize_load(ir_node *load) ...@@ -660,6 +654,7 @@ static unsigned optimize_load(ir_node *load)
if (info->projs[pn_Load_res]) if (info->projs[pn_Load_res])
exchange(info->projs[pn_Load_res], new_node); exchange(info->projs[pn_Load_res], new_node);
exchange(load, new_Bad());
reduce_adr_usage(ptr); reduce_adr_usage(ptr);
return res | DF_CHANGED; return res | DF_CHANGED;
} }
...@@ -704,6 +699,7 @@ static unsigned optimize_load(ir_node *load) ...@@ -704,6 +699,7 @@ static unsigned optimize_load(ir_node *load)
res |= DF_CHANGED; res |= DF_CHANGED;
} }
} }
exchange(load, new_Bad());
reduce_adr_usage(ptr); reduce_adr_usage(ptr);
return res; return res;
} }
...@@ -740,6 +736,7 @@ static unsigned optimize_load(ir_node *load) ...@@ -740,6 +736,7 @@ static unsigned optimize_load(ir_node *load)
exchange(info->projs[pn_Load_res], copy_const_value(get_irn_dbg_info(load), c)); exchange(info->projs[pn_Load_res], copy_const_value(get_irn_dbg_info(load), c));
res |= DF_CHANGED; res |= DF_CHANGED;
} }
exchange(load, new_Bad());
reduce_adr_usage(ptr); reduce_adr_usage(ptr);
return res; return res;
} }
...@@ -809,6 +806,7 @@ static unsigned follow_Load_chain_for_Store(ir_node *store, ir_node *curr) { ...@@ -809,6 +806,7 @@ static unsigned follow_Load_chain_for_Store(ir_node *store, ir_node *curr) {
if (get_Store_volatility(pred) != volatility_is_volatile && !pred_info->projs[pn_Store_X_except]) { if (get_Store_volatility(pred) != volatility_is_volatile && !pred_info->projs[pn_Store_X_except]) {
DBG_OPT_WAW(pred, store); DBG_OPT_WAW(pred, store);
exchange( pred_info->projs[pn_Store_M], get_Store_mem(pred) ); exchange( pred_info->projs[pn_Store_M], get_Store_mem(pred) );
exchange(pred, new_Bad());
reduce_adr_usage(ptr); reduce_adr_usage(ptr);
return DF_CHANGED; return DF_CHANGED;
} }
...@@ -822,6 +820,7 @@ static unsigned follow_Load_chain_for_Store(ir_node *store, ir_node *curr) { ...@@ -822,6 +820,7 @@ static unsigned follow_Load_chain_for_Store(ir_node *store, ir_node *curr) {
if (! info->projs[pn_Store_X_except]) { if (! info->projs[pn_Store_X_except]) {
DBG_OPT_WAR(store, pred); DBG_OPT_WAR(store, pred);
exchange( info->projs[pn_Store_M], mem ); exchange( info->projs[pn_Store_M], mem );
exchange(store, new_Bad());
reduce_adr_usage(ptr); reduce_adr_usage(ptr);
return DF_CHANGED; return DF_CHANGED;
} }
...@@ -1008,8 +1007,6 @@ static unsigned optimize_phi(ir_node *phi, walk_env_t *wenv) ...@@ -1008,8 +1007,6 @@ static unsigned optimize_phi(ir_node *phi, walk_env_t *wenv)
#ifdef DO_CACHEOPT #ifdef DO_CACHEOPT
co_set_irn_name(store, co_get_irn_ident(old_store)); co_set_irn_name(store, co_get_irn_ident(old_store));
#endif #endif
/* we replaced n uses by 1 */
set_irn_n_uses(ptr, get_irn_n_uses(ptr) - n + 1);
projM = new_rd_Proj(NULL, current_ir_graph, block, store, mode_M, pn_Store_M); projM = new_rd_Proj(NULL, current_ir_graph, block, store, mode_M, pn_Store_M);
...@@ -1072,6 +1069,7 @@ static void do_load_store_optimize(ir_node *n, void *env) ...@@ -1072,6 +1069,7 @@ static void do_load_store_optimize(ir_node *n, void *env)
void optimize_load_store(ir_graph *irg) void optimize_load_store(ir_graph *irg)
{ {
walk_env_t env; walk_env_t env;
int was_activ;
assert(get_irg_phase_state(irg) != phase_building); assert(get_irg_phase_state(irg) != phase_building);
assert(get_irg_pinned(irg) != op_pin_state_floats && assert(get_irg_pinned(irg) != op_pin_state_floats &&
...@@ -1080,6 +1078,13 @@ void optimize_load_store(ir_graph *irg) ...@@ -1080,6 +1078,13 @@ void optimize_load_store(ir_graph *irg)
if (! get_opt_redundant_loadstore()) if (! get_opt_redundant_loadstore())
return; return;
was_activ = edges_activated(irg);
if (was_activ) {
/* we need "fresh" edges */
edges_deactivate(irg);
}
edges_activate(irg);
obstack_init(&env.obst); obstack_init(&env.obst);
env.changes = 0; env.changes = 0;
...@@ -1103,4 +1108,7 @@ void optimize_load_store(ir_graph *irg) ...@@ -1103,4 +1108,7 @@ void optimize_load_store(ir_graph *irg)
have Bad() predecessors. */ have Bad() predecessors. */
set_irg_doms_inconsistent(irg); set_irg_doms_inconsistent(irg);
} }
if (! was_activ)
edges_deactivate(irg);
} }
Supports Markdown
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