summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
910768f)
- when optimizing Phi(St, ST, ...) handle correctly the case that the Stores
might be cascaded
[r7959]
int i, n;
ir_node *store, *old_store, *ptr, *block, *phiM, *phiD, *exc, *projM;
ir_mode *mode;
int i, n;
ir_node *store, *old_store, *ptr, *block, *phiM, *phiD, *exc, *projM;
ir_mode *mode;
+ ir_node **inM, **inD, **stores;
int *idx;
dbg_info *db = NULL;
ldst_info_t *info;
int *idx;
dbg_info *db = NULL;
ldst_info_t *info;
*/
/* first step: collect all inputs */
*/
/* first step: collect all inputs */
+ NEW_ARR_A(ir_node *, stores, n);
NEW_ARR_A(ir_node *, inM, n);
NEW_ARR_A(ir_node *, inD, n);
NEW_ARR_A(int, idx, n);
NEW_ARR_A(ir_node *, inM, n);
NEW_ARR_A(ir_node *, inD, n);
NEW_ARR_A(int, idx, n);
+ /* prepare: skip the memory proj: we need this in the case some stores
+ are cascaded */
for (i = 0; i < n; ++i) {
ir_node *pred = skip_Proj(get_Phi_pred(phi, i));
info = get_irn_link(pred);
for (i = 0; i < n; ++i) {
ir_node *pred = skip_Proj(get_Phi_pred(phi, i));
info = get_irn_link(pred);
+ stores[i] = pred;
+
+ exchange(info->projs[pn_Store_M], get_Store_mem(pred));
+ }
+
+ for (i = 0; i < n; ++i) {
+ ir_node *pred = stores[i];
+ info = get_irn_link(pred);
+
inM[i] = get_Store_mem(pred);
inD[i] = get_Store_value(pred);
idx[i] = info->exc_idx;
inM[i] = get_Store_mem(pred);
inD[i] = get_Store_value(pred);
idx[i] = info->exc_idx;