BugFix:
authorMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Tue, 27 Jun 2006 14:13:14 +0000 (14:13 +0000)
committerMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Tue, 27 Jun 2006 14:13:14 +0000 (14:13 +0000)
 - when optimizing Phi(St, ST, ...) handle correctly the case that the Stores
   might be cascaded

[r7959]

ir/opt/ldstopt.c

index b572914..010df3a 100644 (file)
@@ -898,7 +898,7 @@ static unsigned optimize_phi(ir_node *phi, walk_env_t *wenv)
   int i, n;
   ir_node *store, *old_store, *ptr, *block, *phiM, *phiD, *exc, *projM;
   ir_mode *mode;
-  ir_node **inM, **inD;
+  ir_node **inM, **inD, **stores;
   int *idx;
   dbg_info *db = NULL;
   ldst_info_t *info;
@@ -976,14 +976,26 @@ static unsigned optimize_phi(ir_node *phi, walk_env_t *wenv)
    */
 
   /* 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);
 
+  /* 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);
 
+    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;