int i, n;
ir_node *store, *old_store, *ptr, *block, *phi_block, *phiM, *phiD, *exc, *projM;
ir_mode *mode;
- ir_node **inM, **inD, **stores;
+ ir_node **inM, **inD, **projMs;
int *idx;
dbg_info *db = NULL;
ldst_info_t *info;
* Is only allowed if the predecessor blocks have only one successor.
*/
- NEW_ARR_A(ir_node *, stores, n);
+ NEW_ARR_A(ir_node *, projMs, n);
NEW_ARR_A(ir_node *, inM, n);
NEW_ARR_A(ir_node *, inD, n);
NEW_ARR_A(int, idx, n);
memory Proj.
*/
for (i = 0; i < n; ++i)
- stores[i] = skip_Proj(get_Phi_pred(phi, i));
+ projMs[i] = get_Phi_pred(phi, i);
- /* first step: collect all inputs */
- for (i = 0; i < n; ++i) {
- ir_node *store = stores[i];
+ /* first step: collect all inputs and kill the node */
+ for (i = n - 1; i >= 0; --i) {
+ ir_node *store = get_Proj_pred(projMs[i]);
info = get_irn_link(store);
inM[i] = get_Store_mem(store);
inD[i] = get_Store_value(store);
idx[i] = info->exc_idx;
-
kill_node(store);
}
block = get_nodes_block(phi);
/* third step: create a new data Phi */
phiD = new_rd_Phi(get_irn_dbg_info(phi), current_ir_graph, block, n, inD, mode);
+ /* rewire memory */
+ for (i = n - 1; i >= 0; --i) {
+ ir_node *proj = projMs[i];
+
+ exchange(proj, inM[i]);
+ }
+
/* fourth step: create the Store */
store = new_rd_Store(db, current_ir_graph, block, phiM, ptr, phiD);
#ifdef DO_CACHEOPT
/* Handle graph state */
if (env.changes) {
- if (get_irg_outs_state(irg) == outs_consistent)
- set_irg_outs_inconsistent(irg);
+ set_irg_outs_inconsistent(irg);
}
if (env.changes & CF_CHANGED) {