Fixed funcCall parameter offset
[libfirm] / ir / ir / iropt.c
index 13e3bdd..f40081a 100644 (file)
 # include "irgraph_t.h"
 # include "irmode_t.h"
 # include "iropt_t.h"
-# include "ircons.h"
+# include "ircons_t.h"
 # include "irgmod.h"
 # include "irvrfy.h"
-# include "tv.h"
+# include "tv_t.h"
 # include "dbginfo_t.h"
 # include "iropt_dbg.h"
 # include "irflag_t.h"
@@ -993,8 +993,8 @@ static ir_op *firm_set_default_equivalent_node(ir_op *op)
   CASE(And);
   CASE(Conv);
   CASE(Phi);
-  CASE(Load);          /* dangerous */
-  CASE(Store);         /* dangerous, see todo */
+//  CASE(Load);                /* dangerous */
+//  CASE(Store);               /* dangerous, see todo */
   CASE(Proj);
   CASE(Id);
   default:
@@ -1311,22 +1311,25 @@ static ir_node *transform_node_Proj(ir_node *proj)
 
 /**
  * Transform a Store before a Store to the same address...
+ * Both nodes must be in the same block.
  *
  * @todo Check for volatile! Moreover, what if the first store
  *       has a exception handler while the other has not?
  */
 static ir_node *transform_node_Store(ir_node *store)
 {
-  ir_node *n   = skip_Proj(get_Store_mem(store));
-  ir_node *ptr = get_Store_ptr(store);
+  ir_node *pred = skip_Proj(get_Store_mem(store));
+  ir_node *ptr  = get_Store_ptr(store);
 
-  if (get_irn_op(n) == op_Store && get_Store_ptr(n) == ptr) {
+  if (get_irn_op(pred) == op_Store &&
+      get_Store_ptr(pred) == ptr   &&
+      get_nodes_block(pred) == get_nodes_block(store)) {
     /* the Store n is useless, as it is overwritten by the store store */
-    ir_node *mem = get_Store_mem(n);
+    ir_node *mem = get_Store_mem(pred);
 
-    turn_into_tuple(n, 2);
-    set_Tuple_pred(n, pn_Store_M,        mem);
-    set_Tuple_pred(n, pn_Store_X_except, new_Bad());
+    turn_into_tuple(pred, 2);
+    set_Tuple_pred(pred, pn_Store_M,        mem);
+    set_Tuple_pred(pred, pn_Store_X_except, new_Bad());
   }
   return store;
 }
@@ -1463,7 +1466,7 @@ static ir_op *firm_set_default_transform_node(ir_op *op)
   CASE(Eor);
   CASE(Not);
   CASE(Proj);
-  CASE(Store);
+//  CASE(Store);       /* dangerous, see todo */
   CASE(Or);
   default:
     op->transform_node  = NULL;