- further refactoring and finally eliminated the callback for get_out_reg_reqs
[libfirm] / ir / be / arm / arm_optimize.c
index 49091cb..5b5aa0c 100644 (file)
  * @author      Michael Beck
  * @version     $Id: $
  */
-#ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
 
 #include "irgmod.h"
 #include "ircons.h"
 #include "error.h"
 
-#include "benode_t.h"
+#include "benode.h"
 #include "bepeephole.h"
 #include "besched.h"
 
@@ -39,7 +37,6 @@
 #include "gen_arm_regalloc_if.h"
 #include "gen_arm_new_nodes.h"
 
-static const arch_env_t *arch_env;
 static arm_code_gen_t  *cg;
 
 /** Execute ARM ROL. */
@@ -117,7 +114,6 @@ static int allowed_arm_immediate(int offset, arm_vals *result) {
  * Fix an IncSP node if the offset gets too big
  */
 static void peephole_be_IncSP(ir_node *node) {
-       ir_graph *irg;
        ir_node  *block;
        int      offset, cnt, align, sign = 1;
        arm_vals v;
@@ -136,12 +132,11 @@ static void peephole_be_IncSP(ir_node *node) {
 
        be_set_IncSP_offset(node, (int)arm_rol(v.values[0], v.shifts[0]) * sign);
 
-       irg   = current_ir_graph;
        block = get_nodes_block(node);
        align = be_get_IncSP_align(node);
        for (cnt = 1; cnt < v.ops; ++cnt) {
                int value = (int)arm_rol(v.values[cnt], v.shifts[cnt]);
-               ir_node *next = be_new_IncSP(&arm_gp_regs[REG_SP], irg, block, node, value * sign, align);
+               ir_node *next = be_new_IncSP(&arm_gp_regs[REG_SP], block, node, value * sign, align);
                sched_add_after(node, next);
                node = next;
        }
@@ -152,20 +147,19 @@ static void peephole_be_IncSP(ir_node *node) {
  */
 static ir_node *gen_ptr_add(ir_node *node, ir_node *frame, arm_vals *v)
 {
-       ir_graph *irg   = current_ir_graph;
        dbg_info *dbg   = get_irn_dbg_info(node);
        ir_node  *block = get_nodes_block(node);
        int     cnt;
        ir_node *ptr;
 
-       ptr = new_rd_arm_Add_i(dbg, irg, block, frame, mode_Iu, arm_encode_imm_w_shift(v->shifts[0], v->values[0]));
-       arch_set_irn_register(arch_env, ptr, &arm_gp_regs[REG_R12]);
+       ptr = new_bd_arm_Add_i(dbg, block, frame, mode_Iu, arm_encode_imm_w_shift(v->shifts[0], v->values[0]));
+       arch_set_irn_register(ptr, &arm_gp_regs[REG_R12]);
        sched_add_before(node, ptr);
 
        for (cnt = 1; cnt < v->ops; ++cnt) {
                long value = arm_encode_imm_w_shift(v->shifts[cnt], v->values[cnt]);
-               ir_node *next = new_rd_arm_Add_i(dbg, irg, block, ptr, mode_Iu, value);
-               arch_set_irn_register(arch_env, next, &arm_gp_regs[REG_R12]);
+               ir_node *next = new_bd_arm_Add_i(dbg, block, ptr, mode_Iu, value);
+               arch_set_irn_register(next, &arm_gp_regs[REG_R12]);
                sched_add_before(node, next);
                ptr = next;
        }
@@ -177,20 +171,19 @@ static ir_node *gen_ptr_add(ir_node *node, ir_node *frame, arm_vals *v)
 */
 static ir_node *gen_ptr_sub(ir_node *node, ir_node *frame, arm_vals *v)
 {
-       ir_graph *irg   = current_ir_graph;
        dbg_info *dbg   = get_irn_dbg_info(node);
        ir_node  *block = get_nodes_block(node);
        int     cnt;
        ir_node *ptr;
 
-       ptr = new_rd_arm_Sub_i(dbg, irg, block, frame, mode_Iu, arm_encode_imm_w_shift(v->shifts[0], v->values[0]));
-       arch_set_irn_register(arch_env, ptr, &arm_gp_regs[REG_R12]);
+       ptr = new_bd_arm_Sub_i(dbg, block, frame, mode_Iu, arm_encode_imm_w_shift(v->shifts[0], v->values[0]));
+       arch_set_irn_register(ptr, &arm_gp_regs[REG_R12]);
        sched_add_before(node, ptr);
 
        for (cnt = 1; cnt < v->ops; ++cnt) {
                long value = arm_encode_imm_w_shift(v->shifts[cnt], v->values[cnt]);
-               ir_node *next = new_rd_arm_Sub_i(dbg, irg, block, ptr, mode_Iu, value);
-               arch_set_irn_register(arch_env, next, &arm_gp_regs[REG_R12]);
+               ir_node *next = new_bd_arm_Sub_i(dbg, block, ptr, mode_Iu, value);
+               arch_set_irn_register(next, &arm_gp_regs[REG_R12]);
                sched_add_before(node, next);
                ptr = next;
        }
@@ -232,23 +225,20 @@ static void peephole_be_Spill(ir_node *node) {
        if (mode_is_float(mode)) {
                if (USE_FPA(cg->isa)) {
                        /* transform into fpaStf */
-                       store = new_rd_arm_fpaStf(dbg, irg, block, ptr, value, get_irg_no_mem(irg), mode);
+                       store = new_bd_arm_fpaStf(dbg, block, ptr, value, get_irg_no_mem(irg), mode);
                        sched_add_before(node, store);
                } else {
                        panic("peephole_be_Spill: spill not supported for this mode");
                }
        } else if (mode_is_dataM(mode)) {
                 /* transform into Store */;
-                store = new_rd_arm_Store(dbg, irg, block, ptr, value, get_irg_no_mem(irg));
+                store = new_bd_arm_Store(dbg, block, ptr, value, get_irg_no_mem(irg));
                 sched_add_before(node, store);
        } else {
                panic("peephole_be_Spill: spill not supported for this mode");
        }
 
-       be_peephole_before_exchange(node, store);
-       sched_remove(node);
-       exchange(node, store);
-       be_peephole_after_exchange(store);
+       be_peephole_exchange(node, store);
 }
 
 /**
@@ -260,7 +250,6 @@ static void peephole_be_Reload(ir_node *node) {
        ir_node   *block, *ptr, *frame, *load, *mem, *proj;
        ir_mode   *mode;
        dbg_info  *dbg;
-       ir_graph  *irg;
        arm_vals  v;
        const arch_register_t *reg;
 
@@ -278,37 +267,33 @@ static void peephole_be_Reload(ir_node *node) {
                ptr = gen_ptr_sub(node, frame, &v);
        }
 
-       reg   = arch_get_irn_register(arch_env, node);
+       reg   = arch_get_irn_register(node);
        mem   = be_get_Reload_mem(node);
        mode  = get_irn_mode(node);
-       irg   = current_ir_graph;
        dbg   = get_irn_dbg_info(node);
        block = get_nodes_block(node);
 
        if (mode_is_float(mode)) {
                if (USE_FPA(cg->isa)) {
                        /* transform into fpaLdf */
-                       load = new_rd_arm_fpaLdf(dbg, irg, block, ptr, mem, mode);
+                       load = new_bd_arm_fpaLdf(dbg, block, ptr, mem, mode);
                        sched_add_before(node, load);
-                       proj = new_rd_Proj(dbg, irg, block, load, mode, pn_arm_fpaLdf_res);
-                       arch_set_irn_register(arch_env, proj, reg);
+                       proj = new_rd_Proj(dbg, block, load, mode, pn_arm_fpaLdf_res);
+                       arch_set_irn_register(proj, reg);
                } else {
                        panic("peephole_be_Spill: spill not supported for this mode");
                }
        } else if (mode_is_dataM(mode)) {
                /* transform into Store */;
-               load = new_rd_arm_Load(dbg, irg, block, ptr, mem);
+               load = new_bd_arm_Load(dbg, block, ptr, mem);
                sched_add_before(node, load);
-               proj = new_rd_Proj(dbg, irg, block, load, mode_Iu, pn_arm_Load_res);
-               arch_set_irn_register(arch_env, proj, reg);
+               proj = new_rd_Proj(dbg, block, load, mode_Iu, pn_arm_Load_res);
+               arch_set_irn_register(proj, reg);
        } else {
                panic("peephole_be_Spill: spill not supported for this mode");
        }
 
-       be_peephole_before_exchange(node, proj);
-       sched_remove(node);
-       exchange(node, proj);
-       be_peephole_after_exchange(proj);
+       be_peephole_exchange(node, proj);
 }
 
 /**
@@ -322,8 +307,7 @@ static void register_peephole_optimisation(ir_op *op, peephole_opt_func func) {
 /* Perform peephole-optimizations. */
 void arm_peephole_optimization(arm_code_gen_t *new_cg)
 {
-       cg       = new_cg;
-       arch_env = cg->arch_env;
+       cg = new_cg;
 
        /* register peephole optimizations */
        clear_irp_opcodes_generic_func();