An improved (?) version
[libfirm] / ir / be / beabi.c
index 16a9c6b..e4c2802 100644 (file)
@@ -1691,6 +1691,7 @@ static void fix_address_of_parameter_access(be_abi_irg_t *env, ir_entity *value_
        }
 }
 
+#if 0
 /**
  * The start block has no jump, instead it has an initial exec Proj.
  * The backend wants to handle all blocks the same way, so we replace
@@ -1721,6 +1722,7 @@ static void fix_start_block(ir_node *block, void *env) {
                }
        }
 }
+#endif
 
 /**
  * Modify the irg itself and the frame type.
@@ -1740,7 +1742,7 @@ static void modify_irg(be_abi_irg_t *env)
        pset *dont_save           = pset_new_ptr(8);
 
        int n_params;
-       int i, j, n, temp;
+       int i, j, n;
 
        reg_node_map_t *rm;
        const arch_register_t *fp_reg;
@@ -1938,18 +1940,22 @@ static void modify_irg(be_abi_irg_t *env)
                        }
 
                        else if(arg->on_stack) {
-                               /* For atomic parameters which are actually used, we create a StackParam node. */
+                               ir_node *addr = be_new_FrameAddr(sp->reg_class, irg, reg_params_bl, frame_pointer, arg->stack_ent);
+
+                               /* For atomic parameters which are actually used, we create a Load node. */
                                if(is_atomic_type(param_type) && get_irn_n_edges(args[i]) > 0) {
                                        ir_mode *mode                    = get_type_mode(param_type);
-                                       const arch_register_class_t *cls = arch_isa_get_reg_class_for_mode(isa, mode);
-                                       repl = be_new_StackParam(cls, isa->bp->reg_class, irg, reg_params_bl, mode, frame_pointer, arg->stack_ent);
+                                       ir_node *load = new_rd_Load(NULL, irg, reg_params_bl,
+                                                                   new_NoMem(), addr, mode);
+                                       repl = new_rd_Proj(NULL, irg, reg_params_bl, load,
+                                                          mode, pn_Load_res);
                                }
 
                                /* The stack parameter is not primitive (it is a struct or array),
                                   we thus will create a node representing the parameter's address
                                   on the stack. */
                                else {
-                                       repl = be_new_FrameAddr(sp->reg_class, irg, reg_params_bl, frame_pointer, arg->stack_ent);
+                                       repl = addr;
                                }
                        }
 
@@ -1985,9 +1991,12 @@ static void modify_irg(be_abi_irg_t *env)
        del_pset(dont_save);
        obstack_free(&env->obst, args);
 
+       /* this was needed for STA backend... */
+#if 0
        /* handle start block here (place a jump in the block) */
-       temp = 0;
-       irg_block_walk_graph(irg, fix_start_block, NULL, &temp);
+       i = 0;
+       irg_block_walk_graph(irg, fix_start_block, NULL, &i);
+#endif
 }
 
 /** Fix the state inputs of calls that still hang on unknowns */