/** A Load/Store info. */
typedef struct ldst_info_t {
- ir_node *projs[MAX_PROJ]; /**< list of Proj's of this node */
+ ir_node *projs[MAX_PROJ+1]; /**< list of Proj's of this node */
ir_node *exc_block; /**< the exception block if available */
int exc_idx; /**< predecessor index in the exception block */
unsigned visited; /**< visited counter for breaking loops */
if (is_Proj(proj)) {
pred = get_Proj_pred(proj);
- is_exc = get_Proj_proj(proj) == pn_Generic_X_except;
+ is_exc = is_x_except_Proj(proj);
}
/* ignore Bad predecessors, they will be removed later */
/* no exception */
if (info->projs[pn_Load_X_except]) {
ir_graph *irg = get_irn_irg(load);
- exchange( info->projs[pn_Load_X_except], new_r_Bad(irg));
+ exchange( info->projs[pn_Load_X_except], new_r_Bad(irg, mode_X));
res |= CF_CHANGED;
}
if (info->projs[pn_Load_X_regular]) {
/* no exception */
if (info->projs[pn_Load_X_except]) {
ir_graph *irg = get_irn_irg(load);
- exchange(info->projs[pn_Load_X_except], new_r_Bad(irg));
+ exchange(info->projs[pn_Load_X_except], new_r_Bad(irg, mode_X));
res |= CF_CHANGED;
}
if (info->projs[pn_Load_X_regular]) {
/* no exception, clear the info field as it might be checked later again */
if (info->projs[pn_Load_X_except]) {
ir_graph *irg = get_irn_irg(load);
- exchange(info->projs[pn_Load_X_except], new_r_Bad(irg));
+ exchange(info->projs[pn_Load_X_except], new_r_Bad(irg, mode_X));
info->projs[pn_Load_X_except] = NULL;
res |= CF_CHANGED;
}
/* we completely replace the load by this value */
if (info->projs[pn_Load_X_except]) {
ir_graph *irg = get_irn_irg(load);
- exchange(info->projs[pn_Load_X_except], new_r_Bad(irg));
+ exchange(info->projs[pn_Load_X_except], new_r_Bad(irg, mode_X));
info->projs[pn_Load_X_except] = NULL;
res |= CF_CHANGED;
}
static unsigned optimize_phi(ir_node *phi, walk_env_t *wenv)
{
int i, n;
- ir_node *store, *old_store, *ptr, *block, *phi_block, *phiM, *phiD, *exc, *projM;
+ ir_node *store, *ptr, *block, *phi_block, *phiM, *phiD, *exc, *projM;
+#ifdef DO_CACHEOPT
+ ir_node *old_store;
+#endif
ir_mode *mode;
ir_node **inM, **inD, **projMs;
int *idx;
return 0;
store = skip_Proj(projM);
+#ifdef DO_CACHEOPT
old_store = store;
+#endif
if (!is_Store(store))
return 0;
break;
default:
- ;
+ break;
}
} /* do_load_store_optimize */
static void move_loads_out_of_loops(scc *pscc, loop_env *env)
{
ir_node *phi, *load, *next, *other, *next_other;
- ir_entity *ent;
int j;
phi_entry *phi_list = NULL;
set *avail;
}
}
}
-
- /* Within unreachable code, there might be memory loops without Phis. */
- if (phi_list == NULL)
- return;
+ /* no Phis no fun */
+ assert(phi_list != NULL && "DFS found a loop without Phi");
/* for now, we cannot handle more than one input (only reducible cf) */
if (phi_list->next != NULL)
/* for now, we can only move Load(Global) */
if (! is_Global(ptr))
continue;
- ent = get_Global_entity(ptr);
load_mode = get_Load_mode(load);
for (other = pscc->head; other != NULL; other = next_other) {
node_entry *ne = get_irn_ne(other, env);
ir_node *pred = get_Block_cfgpred(endblk, i);
pred = skip_Proj(pred);
- if (is_Return(pred))
+ if (is_Return(pred)) {
dfs(get_Return_mem(pred), env);
- else if (is_Raise(pred))
+ } else if (is_Raise(pred)) {
dfs(get_Raise_mem(pred), env);
- else if (is_fragile_op(pred))
+ } else if (is_fragile_op(pred)) {
dfs(get_fragile_op_mem(pred), env);
- else if (is_Bad(pred))
- /* ignore non-optimized block predecessor */;
- else {
+ } else if (is_Bad(pred)) {
+ /* ignore non-optimized block predecessor */
+ } else {
assert(0 && "Unknown EndBlock predecessor");
}
}
/* Handle graph state */
if (env.changes) {
- set_irg_outs_inconsistent(irg);
set_irg_entity_usage_state(irg, ir_entity_usage_not_computed);
+ edges_deactivate(irg);
}
if (env.changes & CF_CHANGED) {