bessaconstr: Avoid duplicate map lookups.
[libfirm] / ir / be / amd64 / amd64_transform.c
index 0d623d6..97a16e7 100644 (file)
@@ -20,7 +20,6 @@
 /**
  * @file
  * @brief   code selection (transform FIRM into amd64 FIRM)
- * @version $Id: amd64_transform.c 26673 2009-10-01 16:43:13Z matze $
  */
 #include "config.h"
 
@@ -34,9 +33,9 @@
 #include "error.h"
 #include "debug.h"
 
-#include "../benode.h"
-#include "../betranshlp.h"
-#include "../beutil.h"
+#include "benode.h"
+#include "betranshlp.h"
+#include "beutil.h"
 #include "bearch_amd64_t.h"
 
 #include "amd64_nodes_attr.h"
@@ -91,8 +90,6 @@ static ir_node *gen_Const(ir_node *node) {
        ir_node *res = create_const_graph(node, block);
        (void) mode;
 
-       be_dep_on_frame(res);
-
        return res;
 }
 
@@ -109,7 +106,6 @@ static ir_node *gen_SymConst(ir_node *node)
        ir_node   *new_node;
 
        new_node = new_bd_amd64_SymConst(dbgi, block, entity);
-       be_dep_on_frame(new_node);
        return new_node;
 }
 
@@ -128,7 +124,6 @@ static ir_node *gen_Add(ir_node *node) {
        ir_node  *new_op2 = be_transform_node(op2);
 
        ir_node *res = new_bd_amd64_Add(dbgi, block, new_op1, new_op2);
-       be_dep_on_frame (res);
        return res;
 }
 
@@ -147,7 +142,6 @@ static ir_node *gen_Sub(ir_node *node) {
        ir_node  *new_op2 = be_transform_node(op2);
 
        ir_node *res = new_bd_amd64_Sub(dbgi, block, new_op1, new_op2);
-       be_dep_on_frame (res);
        return res;
 }
 
@@ -161,7 +155,6 @@ static ir_node *gen_Mul(ir_node *node) {
        ir_node  *new_op2 = be_transform_node(op2);
 
        ir_node *res = new_bd_amd64_Mul(dbgi, block, new_op1, new_op2);
-       be_dep_on_frame (res);
        return res;
 }
 
@@ -186,7 +179,7 @@ static ir_node *gen_Jmp(ir_node *node)
 static ir_node *gen_be_Call(ir_node *node)
 {
        ir_node *res = be_duplicate_node(node);
-       arch_irn_add_flags(res, arch_irn_flags_modify_flags);
+       arch_add_irn_flags(res, arch_irn_flags_modify_flags);
 
        return res;
 }
@@ -203,7 +196,7 @@ static ir_node *gen_Cmp(ir_node *node)
        bool      is_unsigned;
 
        if (mode_is_float(cmp_mode)) {
-               panic("Floating point not implemented yet (in gen_Cmp)!");
+               panic("Floating point not implemented yet!");
        }
 
        assert(get_irn_mode(op2) == cmp_mode);
@@ -309,18 +302,10 @@ static bool upper_bits_clean(ir_node *transformed_node, ir_mode *mode)
 }
 #endif
 
-/**
- * Change some phi modes
- */
 static ir_node *gen_Phi(ir_node *node)
 {
+       ir_mode                   *mode = get_irn_mode(node);
        const arch_register_req_t *req;
-       ir_node  *block = be_transform_node(get_nodes_block(node));
-       ir_graph *irg   = current_ir_graph;
-       dbg_info *dbgi  = get_irn_dbg_info(node);
-       ir_mode  *mode  = get_irn_mode(node);
-       ir_node  *phi;
-
        if (mode_needs_gp_reg(mode)) {
                /* all integer operations are on 64bit registers now */
                mode = mode_Lu;
@@ -329,22 +314,9 @@ static ir_node *gen_Phi(ir_node *node)
                req = arch_no_register_req;
        }
 
-       /* phi nodes allow loops, so we use the old arguments for now
-        * and fix this later */
-       phi = new_ir_node(dbgi, irg, block, op_Phi, mode, get_irn_arity(node),
-                         get_irn_in(node) + 1);
-       copy_node_attr(irg, node, phi);
-       be_duplicate_deps(node, phi);
-
-       arch_set_out_register_req(phi, 0, req);
-
-       be_enqueue_preds(node);
-
-       return phi;
+       return be_transform_phi(node, req);
 }
 
-
-
 /**
  * Transforms a Conv node.
  *
@@ -367,7 +339,6 @@ static ir_node *gen_Conv(ir_node *node)
        } else { /* complete in gp registers */
                int src_bits = get_mode_size_bits(src_mode);
                int dst_bits = get_mode_size_bits(dst_mode);
-               int min_bits;
                ir_mode *min_mode;
 
                if (src_bits == dst_bits) {
@@ -376,10 +347,8 @@ static ir_node *gen_Conv(ir_node *node)
                }
 
                if (src_bits < dst_bits) {
-                       min_bits = src_bits;
                        min_mode = src_mode;
                } else {
-                       min_bits = dst_bits;
                        min_mode = dst_mode;
                }
 
@@ -501,12 +470,10 @@ static ir_node *gen_Proj_Load(ir_node *node)
  */
 static ir_node *gen_Proj(ir_node *node)
 {
-       ir_graph *irg  = current_ir_graph;
        dbg_info *dbgi = get_irn_dbg_info(node);
        ir_node  *pred = get_Proj_pred(node);
        long     proj  = get_Proj_proj(node);
 
-       (void) irg;
     (void) dbgi;
 
        if (is_Store(pred)) {
@@ -524,14 +491,12 @@ static ir_node *gen_Proj(ir_node *node)
        } else if (be_is_AddSP(pred)) {
                //panic("gen_Proj not implemented for AddSP");
                return gen_Proj_be_AddSP(node);
-       } else if (is_Cmp(pred)) {
-               //panic("gen_Proj not implemented for Cmp");
-               return gen_Proj_Cmp(node);
        } else if (is_Div(pred)) {
                return gen_Proj_Div(node);
 #endif
        } else if (is_Start(pred)) {
 #if 0
+               ir_graph *const irg = get_irn_irg(node);
                if (node == get_irg_anchor(irg, anchor_tls)) {
                        return gen_Proj_tls(node);
                }