- drop dependency of predefined modes
[libfirm] / ir / lower / lower_intrinsics.c
index f64c039..5a3ccf8 100644 (file)
@@ -24,9 +24,7 @@
  * @version $Id$
  */
 
-#ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
 
 #include "lowering.h"
 #include "irop_t.h"
@@ -42,6 +40,7 @@
 #include "pmap.h"
 #include "array_t.h"
 #include "iropt_dbg.h"
+#include "error.h"
 
 /** Walker environment. */
 typedef struct _walker_env {
@@ -121,12 +120,17 @@ unsigned lower_intrinsics(i_record *list, int length, int part_block_used) {
        for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
                irg = get_irp_irg(i);
 
-               if (part_block_used)
+               if (part_block_used) {
+                       ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK | IR_RESOURCE_PHI_LIST);
                        collect_phiprojs(irg);
+               }
 
                wenv.nr_of_intrinsics = 0;
                irg_walk_graph(irg, NULL, call_mapper, &wenv);
 
+               if (part_block_used)
+                       ir_free_resources(irg, IR_RESOURCE_IRN_LINK | IR_RESOURCE_PHI_LIST);
+
                if (wenv.nr_of_intrinsics > 0) {
                        /* Changes detected: we might have added/removed nodes. */
                        set_irg_outs_inconsistent(irg);
@@ -211,7 +215,12 @@ int i_mapper_alloca(ir_node *call, void *ctx) {
        (void) ctx;
 
        if (mode_is_signed(get_irn_mode(op))) {
-               op = new_rd_Conv(dbg, current_ir_graph, block, op, mode_Iu);
+               ir_mode *mode = get_irn_mode(op);
+               mode = find_unsigned_mode(mode);
+               if (mode == NULL) {
+                       panic("Cannot find unsigned mode for %M", mode);
+               }
+               op = new_rd_Conv(dbg, current_ir_graph, block, op, mode);
        }
 
        irn    = new_rd_Alloc(dbg, current_ir_graph, block, mem, op, firm_unknown_type, stack_alloc);
@@ -287,7 +296,7 @@ int i_mapper_pow(ir_node *call, void *ctx) {
                if (tarval_is_null(tv)) {
                        /* pow(x, 0.0) = 1.0 */
                        ir_mode *mode = get_tarval_mode(tv);
-                       irn = new_r_Const(current_ir_graph, block, mode, get_mode_one(mode));
+                       irn = new_Const(mode, get_mode_one(mode));
                } else if (tarval_is_one(tv)) {
                        /* pow(x, 1.0) = x */
                        irn = left;
@@ -307,7 +316,7 @@ int i_mapper_pow(ir_node *call, void *ctx) {
                ir_mode *mode = get_irn_mode(left);
                ir_node *quot;
 
-               irn  = new_r_Const(current_ir_graph, block, mode, get_mode_one(mode));
+               irn  = new_Const(mode, get_mode_one(mode));
                quot = new_rd_Quot(dbg, current_ir_graph, block, mem, irn, left, mode, op_pin_state_pinned);
                mem  = new_r_Proj(current_ir_graph, block, quot, mode_M, pn_Quot_M);
                irn  = new_r_Proj(current_ir_graph, block, quot, mode, pn_Quot_res);
@@ -326,9 +335,8 @@ int i_mapper_exp(ir_node *call, void *ctx) {
 
        if (is_Const(val) && is_Const_null(val)) {
                /* exp(0.0) = 1.0 */
-               ir_node *block = get_nodes_block(call);
                ir_mode *mode  = get_irn_mode(val);
-               ir_node *irn   = new_r_Const(current_ir_graph, block, mode, get_mode_one(mode));
+               ir_node *irn   = new_Const(mode, get_mode_one(mode));
                ir_node *mem   = get_Call_mem(call);
                DBG_OPT_ALGSIM0(call, irn, FS_OPT_RTS_EXP);
                replace_call(irn, call, mem, NULL, NULL);
@@ -363,9 +371,8 @@ static int i_mapper_one_to_zero(ir_node *call, void *ctx, int reason) {
 
        if (is_Const(val) && is_Const_one(val)) {
                /* acos(1.0) = 0.0 */
-               ir_node *block = get_nodes_block(call);
                ir_mode *mode  = get_irn_mode(val);
-               ir_node *irn   = new_r_Const(current_ir_graph, block, mode, get_mode_null(mode));
+               ir_node *irn   = new_Const(mode, get_mode_null(mode));
                ir_node *mem   = get_Call_mem(call);
                DBG_OPT_ALGSIM0(call, irn, reason);
                replace_call(irn, call, mem, NULL, NULL);
@@ -409,9 +416,8 @@ static int i_mapper_symmetric_zero_to_one(ir_node *call, void *ctx, int reason)
 
        if (is_Const(val) && is_Const_null(val)) {
                /* f(0.0) = 1.0 */
-               ir_node *block = get_nodes_block(call);
                ir_mode *mode  = get_irn_mode(val);
-               ir_node *irn   = new_r_Const(current_ir_graph, block, mode, get_mode_one(mode));
+               ir_node *irn   = new_Const(mode, get_mode_one(mode));
                ir_node *mem   = get_Call_mem(call);
                DBG_OPT_ALGSIM0(call, irn, reason);
                replace_call(irn, call, mem, NULL, NULL);
@@ -521,7 +527,7 @@ static ir_node *eval_strlen(ir_entity *ent, ir_type *res_tp) {
        mode = get_type_mode(tp);
 
        /* FIXME: This is too restrict, as the type char might be more the 8bits */
-       if (!mode_is_int(mode) || get_mode_size_bits(mode) != get_mode_size_bits(mode_Bs))
+       if (!mode_is_int(mode) || get_mode_size_bits(mode) != 8)
                return NULL;
 
        n = get_compound_ent_n_values(ent);
@@ -594,7 +600,7 @@ static ir_node *eval_strcmp(ir_entity *left, ir_entity *right, ir_type *res_tp)
        mode = get_type_mode(tp);
 
        /* FIXME: This is too restrict, as the type char might be more the 8bits */
-       if (!mode_is_int(mode) || get_mode_size_bits(mode) != get_mode_size_bits(mode_Bs))
+       if (!mode_is_int(mode) || get_mode_size_bits(mode) != 8)
                return NULL;
 
        tp = get_entity_type(right);
@@ -606,7 +612,7 @@ static ir_node *eval_strcmp(ir_entity *left, ir_entity *right, ir_type *res_tp)
        mode = get_type_mode(tp);
 
        /* FIXME: This is too restrict, as the type char might be more the 8bits */
-       if (!mode_is_int(mode) || get_mode_size_bits(mode) != get_mode_size_bits(mode_Bs))
+       if (!mode_is_int(mode) || get_mode_size_bits(mode) != 8)
                return NULL;
 
        n   = get_compound_ent_n_values(left);
@@ -673,7 +679,7 @@ static int is_empty_string(ir_entity *ent) {
        mode = get_type_mode(tp);
 
        /* FIXME: This is too restrict, as the type char might be more the 8bits */
-       if (!mode_is_int(mode) || get_mode_size_bits(mode) != get_mode_size_bits(mode_Bs))
+       if (!mode_is_int(mode) || get_mode_size_bits(mode) != 8)
                return 0;
 
        n = get_compound_ent_n_values(ent);
@@ -713,9 +719,8 @@ int i_mapper_strcmp(ir_node *call, void *ctx) {
                /* a strcmp(s, s) ==> 0 */
                ir_node *mem   = get_Call_mem(call);
                ir_mode *mode  = get_type_mode(res_tp);
-               ir_node *block = get_nodes_block(call);
 
-               irn = new_r_Const(current_ir_graph, block, mode, get_mode_null(mode));
+               irn = new_Const(mode, get_mode_null(mode));
                DBG_OPT_ALGSIM0(call, irn, FS_OPT_RTS_STRCMP);
                replace_call(irn, call, mem, NULL, NULL);
                return 1;
@@ -791,9 +796,8 @@ int i_mapper_strncmp(ir_node *call, void *ctx) {
                ir_type   *call_tp = get_entity_type(ent);
                ir_type   *res_tp  = get_method_res_type(call_tp, 0);
                ir_mode   *mode    = get_type_mode(res_tp);
-               ir_node   *block   = get_nodes_block(call);
 
-               irn = new_r_Const(current_ir_graph, block, mode, get_mode_null(mode));
+               irn = new_Const(mode, get_mode_null(mode));
                DBG_OPT_ALGSIM0(call, irn, FS_OPT_RTS_STRNCMP);
                replace_call(irn, call, mem, NULL, NULL);
                return 1;