cleanup vrp
[libfirm] / ir / lower / lower_softfloat.c
index 5d575ab..0813381 100644 (file)
@@ -37,6 +37,7 @@
 #include "irgwalk.h"
 #include "irmode.h"
 #include "iropt_dbg.h"
+#include "iroptimize.h"
 #include "irprog_t.h"
 #include "lower_softfloat.h"
 #include "lowering.h"
@@ -77,7 +78,7 @@ static ir_type *unop_tp_lu_f;
 /** A map from a method type to its lowered type. */
 static pmap *lowered_type;
 
-ir_nodeset_t created_mux_nodes;
+static ir_nodeset_t created_mux_nodes;
 
 /**
  * @return The lowered (floating point) mode.
@@ -140,7 +141,6 @@ static ir_type *get_softfloat_type(const ir_node *n)
 
        switch (opcode) {
        case iro_Div:
-               mode         = get_Div_resmode(n);
                operand_mode = get_irn_mode(get_Div_left(n));
                /* fall through */
        case iro_Add:
@@ -313,14 +313,12 @@ static ir_node *create_softfloat_symconst(const ir_node *n, const char *name)
        assert(double_types <= 3);
 
        if (float_types + double_types > 1)
-               snprintf(buf, sizeof(buf), "__%s%s%s%s%d", name, first_param, second_param, result, float_types + double_types);
+               snprintf(buf, sizeof(buf), "__%s%s%s%s%u", name, first_param, second_param, result, float_types + double_types);
        else
                snprintf(buf, sizeof(buf), "__%s%s%s%s", name, first_param, second_param, result);
 
-       id  = new_id_from_str(buf);
-       ent = new_entity(get_glob_type(), id, method);
-
-       set_entity_ld_ident(ent, get_entity_ident(ent));
+       id           = new_id_from_str(buf);
+       ent          = create_compilerlib_entity(id, method);
        sym.entity_p = ent;
 
        return new_r_SymConst(irg, mode_P_code, sym, symconst_addr_ent);
@@ -380,7 +378,7 @@ static ir_type *lower_method_type(ir_type *mtp)
        size_t   n_param;
        size_t   n_res;
 
-       res = (ir_type*)pmap_get(lowered_type, mtp);
+       res = pmap_get(ir_type, lowered_type, mtp);
        if (res != NULL)
                return res;
 
@@ -415,7 +413,7 @@ static ir_type *lower_method_type(ir_type *mtp)
        set_method_calling_convention(res, get_method_calling_convention(mtp));
        set_method_additional_properties(res, get_method_additional_properties(mtp));
 
-       set_lowered_type(mtp, res);
+       set_higher_type(res, mtp);
 
        pmap_insert(lowered_type, mtp, res);
        return res;
@@ -475,7 +473,7 @@ static void lower_Call(ir_node *node)
  */
 static void lower_Cmp(ir_node *n)
 {
-       ir_node         *symconst;
+       ir_node         *symconst    = NULL;
        ir_node         *block       = get_nodes_block(n);
        ir_node         *call_result = NULL;
        dbg_info        *dbgi        = get_irn_dbg_info(n);
@@ -485,7 +483,7 @@ static void lower_Cmp(ir_node *n)
        ir_mode         *op_mode     = get_irn_mode(left);
        ir_node         *right       = get_Cmp_right(n);
        ir_node         *symconst2   = NULL;
-       ir_node         *zero        = new_rd_Const_long(dbgi, irg, mode_Is, 0);
+       ir_node         *zero        = new_rd_Const(dbgi, irg, get_mode_null(mode_Is));
 
        if (! mode_is_float(op_mode))
                return;
@@ -602,23 +600,19 @@ static const tarval_mode_info hex_output = {
  */
 static void lower_Const(ir_node *n)
 {
-       ir_mode   *lowered_mode;
-       ir_mode   *mode         = get_irn_mode(n);
-       ir_tarval *tv = get_Const_tarval(n);
-       char       buf[100];
-       size_t     len;
-
-       if (! mode_is_float(mode))
+       ir_mode *mode = get_irn_mode(n);
+       if (!mode_is_float(mode))
                return;
 
-       lowered_mode = get_lowered_mode(mode);
+       ir_mode *lowered_mode = get_lowered_mode(mode);
        set_irn_mode(n, lowered_mode);
 
        set_tarval_mode_output_option(mode, &hex_output);
-       tarval_snprintf(buf, 100, get_Const_tarval(n));
+       char buf[100];
+       tarval_snprintf(buf, sizeof(buf), get_Const_tarval(n));
 
-       len = strlen(buf);
-       tv  = new_tarval_from_str(buf, len, lowered_mode);
+       size_t     len = strlen(buf);
+       ir_tarval *tv  = new_tarval_from_str(buf, len, lowered_mode);
        set_Const_tarval(n, tv);
 }
 
@@ -695,16 +689,14 @@ static void lower_Conv(ir_node *n)
  */
 static void lower_Div(ir_node *n)
 {
-       ir_node         *symconst;
-       ir_node         *block       = get_nodes_block(n);
-       ir_node         *call_result = NULL;
-       dbg_info        *dbgi        = get_irn_dbg_info(n);
-       ir_graph        *irg         = get_irn_irg(n);
-       ir_node         *left        = get_Div_left(n);
-       ir_mode         *mode        = get_Div_resmode(n);
-       ir_node         *right       = get_Div_right(n);
-       const ir_edge_t *edge;
-       const ir_edge_t *next;
+       ir_node  *symconst;
+       ir_node  *block       = get_nodes_block(n);
+       ir_node  *call_result = NULL;
+       dbg_info *dbgi        = get_irn_dbg_info(n);
+       ir_graph *irg         = get_irn_irg(n);
+       ir_node  *left        = get_Div_left(n);
+       ir_mode  *mode        = get_Div_resmode(n);
+       ir_node  *right       = get_Div_right(n);
 
        if (! mode_is_float(mode))
                return;
@@ -724,7 +716,7 @@ static void lower_Div(ir_node *n)
 
        set_irn_pinned(call, get_irn_pinned(n));
 
-       foreach_out_edge_safe(n, edge, next) {
+       foreach_out_edge_safe(n, edge) {
                ir_node *proj = get_edge_src_irn(edge);
                if (! is_Proj(proj))
                        continue;
@@ -1062,7 +1054,7 @@ void lower_floating_point(void)
 
        ir_prepare_softfloat_lowering();
 
-       clear_irp_opcodes_generic_func();
+       ir_clear_opcodes_generic_func();
        ir_register_softloat_lower_function(op_Add,   lower_Add);
        ir_register_softloat_lower_function(op_Cmp,   lower_Cmp);
        ir_register_softloat_lower_function(op_Conv,  lower_Conv);
@@ -1076,7 +1068,7 @@ void lower_floating_point(void)
 
                ir_nodeset_init(&created_mux_nodes);
 
-               edges_assure(irg);
+               assure_edges(irg);
 
                irg_walk_graph(irg, NULL, lower_node, NULL);
 
@@ -1086,7 +1078,7 @@ void lower_floating_point(void)
                ir_nodeset_destroy(&created_mux_nodes);
        }
 
-       clear_irp_opcodes_generic_func();
+       ir_clear_opcodes_generic_func();
        ir_register_softloat_lower_function(op_Call,  lower_Call);
        ir_register_softloat_lower_function(op_Const, lower_Const);
        ir_register_softloat_lower_function(op_Div,   lower_Div_mode);
@@ -1097,10 +1089,24 @@ void lower_floating_point(void)
                ir_entity *ent         = get_irg_entity(irg);
                ir_type   *mtp         = get_entity_type(ent);
                ir_type   *lowered_mtp = lower_method_type(mtp);
+               ir_type   *frame_tp    = get_irg_frame_type(irg);
+               size_t     n_members;
+               size_t     i;
 
                if (lowered_mtp != mtp)
                        set_entity_type(ent, lowered_mtp);
 
                irg_walk_graph(irg, NULL, lower_mode, NULL);
+
+               /* fixup parameter entities */
+               n_members = get_compound_n_members(frame_tp);
+               for (i = 0; i < n_members; ++i) {
+                       ir_entity *member = get_compound_member(frame_tp, i);
+                       ir_type   *type   = get_entity_type(member);
+                       if (is_Primitive_type(type)) {
+                               ir_type *lowered = lower_type(type);
+                               set_entity_type(member, lowered);
+                       }
+               }
        }
 }