BugFix for a rare case:
[libfirm] / ir / lower / lower_intrinsics.c
index 281c9eb..4cf7233 100644 (file)
@@ -24,9 +24,7 @@
  * @version $Id$
  */
 
-#ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
 
 #include "lowering.h"
 #include "irop_t.h"
@@ -40,7 +38,7 @@
 #include "trouts.h"
 #include "irvrfy.h"
 #include "pmap.h"
-#include "xmalloc.h"
+#include "array_t.h"
 #include "iropt_dbg.h"
 
 /** Walker environment. */
@@ -64,10 +62,10 @@ static void call_mapper(ir_node *node, void *env) {
                ir_entity *ent;
 
                symconst = get_Call_ptr(node);
-               if (! is_SymConst_addr_ent(symconst))
+               if (! is_Global(symconst))
                        return;
 
-               ent = get_SymConst_entity(symconst);
+               ent = get_Global_entity(symconst);
                p   = pmap_find(wenv->c_map, ent);
 
                if (p) {
@@ -210,11 +208,15 @@ int i_mapper_alloca(ir_node *call, void *ctx) {
        dbg_info *dbg  = get_irn_dbg_info(call);
        (void) ctx;
 
+       if (mode_is_signed(get_irn_mode(op))) {
+               op = new_rd_Conv(dbg, current_ir_graph, block, op, mode_Iu);
+       }
+
        irn    = new_rd_Alloc(dbg, current_ir_graph, block, mem, op, firm_unknown_type, stack_alloc);
-       mem    = new_Proj(irn, mode_M, pn_Alloc_M);
-       no_exc = new_Proj(irn, mode_X, pn_Alloc_X_regular);
-       exc    = new_Proj(irn, mode_X, pn_Alloc_X_except);
-       irn    = new_Proj(irn, get_modeP_data(), pn_Alloc_res);
+       mem    = new_rd_Proj(dbg, current_ir_graph, block, irn, mode_M, pn_Alloc_M);
+       no_exc = new_rd_Proj(dbg, current_ir_graph, block, irn, mode_X, pn_Alloc_X_regular);
+       exc    = new_rd_Proj(dbg, current_ir_graph, block, irn, mode_X, pn_Alloc_X_except);
+       irn    = new_rd_Proj(dbg, current_ir_graph, block, irn, get_modeP_data(), pn_Alloc_res);
 
        DBG_OPT_ALGSIM0(call, irn, FS_OPT_RTS_ALLOCA);
        replace_call(irn, call, mem, no_exc, exc);
@@ -484,8 +486,8 @@ int i_mapper_tanh(ir_node *call, void *ctx) {
  */
 static ir_entity *get_const_entity(ir_node *ptr) {
        /* FIXME: this cannot handle constant strings inside struct initializers yet */
-       if (is_SymConst_addr_ent(ptr)) {
-               ir_entity *ent = get_SymConst_entity(ptr);
+       if (is_Global(ptr)) {
+               ir_entity *ent = get_Global_entity(ptr);
 
                if (get_entity_variability(ent) == variability_constant) {
                        /* a constant entity */
@@ -687,9 +689,7 @@ int i_mapper_strcmp(ir_node *call, void *ctx) {
        ir_node   *irn     = NULL;
        ir_node   *exc     = NULL;
        ir_node   *reg     = NULL;
-       ir_node   *adr     = get_Call_ptr(call);
-       ir_entity *ent     = get_SymConst_entity(adr);
-       ir_type   *call_tp = get_entity_type(ent);
+       ir_type   *call_tp = get_Call_type(call);
        ir_type   *res_tp  = get_method_res_type(call_tp, 0);
        ir_entity *ent_l, *ent_r;
        ir_type   *char_tp;
@@ -947,7 +947,7 @@ int i_mapper_RuntimeCall(ir_node *node, runtime_rt *rt) {
                        set_Tuple_pred(node, i, new_r_Bad(irg));
                if (rt->mem_proj_nr >= 0)
                        set_Tuple_pred(node, rt->mem_proj_nr, new_r_Proj(irg, bl, call, mode_M, pn_Call_M_regular));
-               if (get_irn_op(mem) != op_NoMem) {
+               if (!is_NoMem(mem)) {
                        /* Exceptions can only be handled with real memory */
                        if (rt->regular_proj_nr >= 0)
                                set_Tuple_pred(node, rt->regular_proj_nr, new_r_Proj(irg, bl, call, mode_X, pn_Call_X_regular));