lowering: fix i_mapper for new exception attributes
authorMatthias Braun <matze@braunis.de>
Thu, 28 Jul 2011 11:03:05 +0000 (13:03 +0200)
committerMatthias Braun <matze@braunis.de>
Thu, 28 Jul 2011 11:03:05 +0000 (13:03 +0200)
include/libfirm/lowering.h
ir/be/arm/bearch_arm.c
ir/be/sparc/bearch_sparc.c
ir/lower/lower_intrinsics.c

index 6d3d749..8f2ab69 100644 (file)
@@ -569,7 +569,6 @@ typedef struct runtime_rt {
        long      mem_proj_nr;     /**< if >= 0, create a memory ProjM() */
        long      regular_proj_nr; /**< if >= 0, create a regular ProjX() */
        long      exc_proj_nr;     /**< if >= 0, create a exception ProjX() */
-       long      exc_mem_proj_nr; /**< if >= 0, create a exception memory ProjM() */
        long      res_proj_nr;     /**< if >= 0, first result projection number */
 } runtime_rt;
 
index 01f82d0..a81dc02 100644 (file)
@@ -323,7 +323,6 @@ static void arm_handle_intrinsics(void)
                rt_iDiv.mem_proj_nr     = pn_Div_M;
                rt_iDiv.regular_proj_nr = pn_Div_X_regular;
                rt_iDiv.exc_proj_nr     = pn_Div_X_except;
-               rt_iDiv.exc_mem_proj_nr = pn_Div_M;
                rt_iDiv.res_proj_nr     = pn_Div_res;
 
                add_entity_linkage(rt_iDiv.ent, IR_LINKAGE_CONSTANT);
@@ -350,7 +349,6 @@ static void arm_handle_intrinsics(void)
                rt_uDiv.mem_proj_nr     = pn_Div_M;
                rt_uDiv.regular_proj_nr = pn_Div_X_regular;
                rt_uDiv.exc_proj_nr     = pn_Div_X_except;
-               rt_uDiv.exc_mem_proj_nr = pn_Div_M;
                rt_uDiv.res_proj_nr     = pn_Div_res;
 
                set_entity_visibility(rt_uDiv.ent, ir_visibility_external);
@@ -376,7 +374,6 @@ static void arm_handle_intrinsics(void)
                rt_iMod.mem_proj_nr     = pn_Mod_M;
                rt_iMod.regular_proj_nr = pn_Mod_X_regular;
                rt_iMod.exc_proj_nr     = pn_Mod_X_except;
-               rt_iMod.exc_mem_proj_nr = pn_Mod_M;
                rt_iMod.res_proj_nr     = pn_Mod_res;
 
                set_entity_visibility(rt_iMod.ent, ir_visibility_external);
@@ -402,7 +399,6 @@ static void arm_handle_intrinsics(void)
                rt_uMod.mem_proj_nr     = pn_Mod_M;
                rt_uMod.regular_proj_nr = pn_Mod_X_regular;
                rt_uMod.exc_proj_nr     = pn_Mod_X_except;
-               rt_uMod.exc_mem_proj_nr = pn_Mod_M;
                rt_uMod.res_proj_nr     = pn_Mod_res;
 
                set_entity_visibility(rt_uMod.ent, ir_visibility_external);
index d37c804..fa424b5 100644 (file)
@@ -438,7 +438,6 @@ static void sparc_handle_intrinsics(void)
                rt_iMod.mem_proj_nr     = pn_Mod_M;
                rt_iMod.regular_proj_nr = pn_Mod_X_regular;
                rt_iMod.exc_proj_nr     = pn_Mod_X_except;
-               rt_iMod.exc_mem_proj_nr = pn_Mod_M;
                rt_iMod.res_proj_nr     = pn_Mod_res;
 
                set_entity_visibility(rt_iMod.ent, ir_visibility_external);
@@ -464,7 +463,6 @@ static void sparc_handle_intrinsics(void)
                rt_uMod.mem_proj_nr     = pn_Mod_M;
                rt_uMod.regular_proj_nr = pn_Mod_X_regular;
                rt_uMod.exc_proj_nr     = pn_Mod_X_except;
-               rt_uMod.exc_mem_proj_nr = pn_Mod_M;
                rt_uMod.res_proj_nr     = pn_Mod_res;
 
                set_entity_visibility(rt_uMod.ent, ir_visibility_external);
index 957f49c..9051cb3 100644 (file)
@@ -1147,6 +1147,8 @@ int i_mapper_RuntimeCall(ir_node *node, runtime_rt *rt)
        ir_type *mtp;
        ir_node *mem, *bl, *call, *addr, *res_proj;
        ir_node **in;
+       bool     throws_exception;
+       ir_op   *op;
        ir_graph *irg;
        symconst_symbol sym;
        ir_mode *mode = get_irn_mode(node);
@@ -1187,15 +1189,17 @@ int i_mapper_RuntimeCall(ir_node *node, runtime_rt *rt)
                        return 0;
        }
 
-       n_res = get_method_n_ress(mtp);
+       n_res            = get_method_n_ress(mtp);
+       throws_exception = ir_throws_exception(node);
 
        /* step 0: calculate the number of needed Proj's */
        n_proj = 0;
        n_proj = LMAX(n_proj, rt->mem_proj_nr + 1);
-       n_proj = LMAX(n_proj, rt->regular_proj_nr + 1);
-       n_proj = LMAX(n_proj, rt->exc_proj_nr + 1);
-       n_proj = LMAX(n_proj, rt->exc_mem_proj_nr + 1);
        n_proj = LMAX(n_proj, rt->res_proj_nr + 1);
+       if (throws_exception) {
+               n_proj = LMAX(n_proj, rt->regular_proj_nr + 1);
+               n_proj = LMAX(n_proj, rt->exc_proj_nr + 1);
+       }
 
        if (n_proj > 0) {
                if (rt->mode != mode_T) /* must be mode_T */
@@ -1209,6 +1213,7 @@ int i_mapper_RuntimeCall(ir_node *node, runtime_rt *rt)
 
        /* ok, when we are here, the number of predecessors match as well as the parameter modes */
        bl = get_nodes_block(node);
+       op = get_irn_op(node);
 
        in = NULL;
        if (n_param > 0) {
@@ -1236,14 +1241,9 @@ int i_mapper_RuntimeCall(ir_node *node, runtime_rt *rt)
 
                if (rt->mem_proj_nr >= 0)
                        set_Tuple_pred(node, rt->mem_proj_nr, new_r_Proj(call, mode_M, pn_Call_M));
-               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(call, mode_X, pn_Call_X_regular));
-                       if (rt->exc_proj_nr >= 0)
-                               set_Tuple_pred(node, rt->exc_proj_nr, new_r_Proj(call, mode_X, pn_Call_X_except));
-                       if (rt->exc_mem_proj_nr >= 0)
-                               set_Tuple_pred(node, rt->mem_proj_nr, new_r_Proj(call, mode_M, pn_Call_M));
+               if (throws_exception) {
+                       set_Tuple_pred(node, op->pn_x_regular, new_r_Proj(call, mode_X, pn_Call_X_regular));
+                       set_Tuple_pred(node, op->pn_x_except, new_r_Proj(call, mode_X, pn_Call_X_except));
                }
 
                if (rt->res_proj_nr >= 0) {