#include "irflag_t.h"
#include "array.h"
#include "irhooks.h"
+#include "iredges.h"
#include "irtools.h"
#include "opt_polymorphy.h"
}
/** Return the number of uses of an address node */
-#define get_irn_n_uses(adr) (unsigned)PTR_TO_INT(get_irn_link(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))
+#define get_irn_n_uses(adr) get_irn_n_edges(adr)
/**
* walker, collects all Load/Store/Proj nodes
if ((ldst_info->flags & LDST_VISITED) == 0) {
adr = get_Load_ptr(pred);
- set_irn_n_uses(adr, get_irn_n_uses(adr) + 1);
-
ldst_info->flags |= LDST_VISITED;
}
if ((ldst_info->flags & LDST_VISITED) == 0) {
adr = get_Store_ptr(pred);
- set_irn_n_uses(adr, get_irn_n_uses(adr) + 1);
-
ldst_info->flags |= LDST_VISITED;
}
/* a Load which value is neither used nor exception checked, remove it */
exchange(info->projs[pn_Load_M], mem);
+ exchange(load, new_Bad());
reduce_adr_usage(ptr);
}
}
* node and update the counters.
*/
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 (use_count <= 0) {
- /* this Proj is now dead, update the Load/Store info */
+ if (get_irn_n_edges(ptr) <= 0) {
+ /* this Proj is dead now */
ir_node *pred = get_Proj_pred(ptr);
opcode code = get_irn_opcode(pred);
if (info->projs[pn_Load_res])
exchange(info->projs[pn_Load_res], value);
+ exchange(load, new_Bad());
reduce_adr_usage(ptr);
return res | DF_CHANGED;
}
res |= CF_CHANGED;
}
+ exchange(load, new_Bad());
reduce_adr_usage(ptr);
return res |= DF_CHANGED;
}
/* a Load which value is neither used nor exception checked, remove it */
exchange(info->projs[pn_Load_M], mem);
+ exchange(load, new_Bad());
reduce_adr_usage(ptr);
return res | DF_CHANGED;
}
if (info->projs[pn_Load_res])
exchange(info->projs[pn_Load_res], new_node);
+ exchange(load, new_Bad());
reduce_adr_usage(ptr);
return res | DF_CHANGED;
}
res |= DF_CHANGED;
}
}
+ exchange(load, new_Bad());
reduce_adr_usage(ptr);
return res;
}
exchange(info->projs[pn_Load_res], copy_const_value(get_irn_dbg_info(load), c));
res |= DF_CHANGED;
}
+ exchange(load, new_Bad());
reduce_adr_usage(ptr);
return res;
}
if (get_Store_volatility(pred) != volatility_is_volatile && !pred_info->projs[pn_Store_X_except]) {
DBG_OPT_WAW(pred, store);
exchange( pred_info->projs[pn_Store_M], get_Store_mem(pred) );
+ exchange(pred, new_Bad());
reduce_adr_usage(ptr);
return DF_CHANGED;
}
if (! info->projs[pn_Store_X_except]) {
DBG_OPT_WAR(store, pred);
exchange( info->projs[pn_Store_M], mem );
+ exchange(store, new_Bad());
reduce_adr_usage(ptr);
return DF_CHANGED;
}
#ifdef DO_CACHEOPT
co_set_irn_name(store, co_get_irn_ident(old_store));
#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);
void optimize_load_store(ir_graph *irg)
{
walk_env_t env;
+ int was_activ;
assert(get_irg_phase_state(irg) != phase_building);
assert(get_irg_pinned(irg) != op_pin_state_floats &&
if (! get_opt_redundant_loadstore())
return;
+ was_activ = edges_activated(irg);
+ if (was_activ) {
+ /* we need "fresh" edges */
+ edges_deactivate(irg);
+ }
+ edges_activate(irg);
+
obstack_init(&env.obst);
env.changes = 0;
have Bad() predecessors. */
set_irg_doms_inconsistent(irg);
}
+
+ if (! was_activ)
+ edges_deactivate(irg);
}