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;
return 0;
phi_block = get_nodes_block(phi);
- if (! block_postdominates(phi_block, block))
+ if (! block_strictly_postdominates(phi_block, block))
return 0;
/* this is the address of the store */
* 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);
first because we otherwise may loose a store when exchanging its
memory Proj.
*/
- for (i = 0; i < n; ++i)
- stores[i] = skip_Proj(get_Phi_pred(phi, i));
+ for (i = n - 1; i >= 0; --i) {
+ ir_node *store;
- /* first step: collect all inputs */
- for (i = 0; i < n; ++i) {
- ir_node *store = stores[i];
- info = get_irn_link(store);
+ projMs[i] = get_Phi_pred(phi, i);
+ assert(is_Proj(projMs[i]));
+
+ 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 and kill the node */
+ for (i = n - 1; i >= 0; --i) {
+ ir_node *proj = projMs[i];
+
+ if(is_Proj(proj)) {
+ ir_node *store = get_Proj_pred(proj);
+ exchange(proj, inM[i]);
+ kill_node(store);
+ }
+ }
+
/* 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) {