fix illegal usage of compound_graph_path
[libfirm] / ir / lower / lower_dw.c
index 7532b76..483ad47 100644 (file)
@@ -52,6 +52,7 @@
 #include "pdeq.h"
 #include "irdump.h"
 #include "array_t.h"
+#include "irpass_t.h"
 
 /** A map from mode to a primitive type. */
 static pmap *prim_types;
@@ -280,9 +281,7 @@ static void prepare_links(ir_node *node, void *env)
        if (mode == lenv->params->high_signed ||
                mode == lenv->params->high_unsigned) {
                /* ok, found a node that will be lowered */
-               link = obstack_alloc(&lenv->obst, sizeof(*link));
-
-               memset(link, 0, sizeof(*link));
+               link = OALLOCZ(&lenv->obst, node_entry_t);
 
                idx = get_irn_idx(node);
                if (idx >= lenv->n_entries) {
@@ -492,12 +491,11 @@ static void lower_Store(ir_node *node, ir_mode *mode, lower_env_t *env) {
  * @param op      the emulated ir_op
  * @param imode   the input mode of the emulated opcode
  * @param omode   the output mode of the emulated opcode
- * @param block   where the new mode is created
  * @param env     the lower environment
  */
 static ir_node *get_intrinsic_address(ir_type *method, ir_op *op,
                                       ir_mode *imode, ir_mode *omode,
-                                      ir_node *block, lower_env_t *env) {
+                                      lower_env_t *env) {
        symconst_symbol sym;
        ir_entity *ent;
        op_mode_entry_t key, *entry;
@@ -567,7 +565,7 @@ static void lower_Div(ir_node *node, ir_mode *mode, lower_env_t *env) {
 
        mtp = mode_is_signed(mode) ? binop_tp_s : binop_tp_u;
        opmode = get_irn_op_mode(node);
-       irn = get_intrinsic_address(mtp, get_irn_op(node), opmode, opmode, block, env);
+       irn = get_intrinsic_address(mtp, get_irn_op(node), opmode, opmode, env);
        call = new_rd_Call(dbg, block, get_Div_mem(node), irn, 4, in, mtp);
        set_irn_pinned(call, get_irn_pinned(node));
        irn = new_r_Proj(block, call, mode_T, pn_Call_T_result);
@@ -577,7 +575,7 @@ static void lower_Div(ir_node *node, ir_mode *mode, lower_env_t *env) {
                case pn_Div_M:         /* Memory result. */
                        /* reroute to the call */
                        set_Proj_pred(proj, call);
-                       set_Proj_proj(proj, pn_Call_M_except);
+                       set_Proj_proj(proj, pn_Call_M);
                        break;
                case pn_Div_X_except:  /* Execution result if exception occurred. */
                        /* reroute to the call */
@@ -644,7 +642,7 @@ static void lower_Mod(ir_node *node, ir_mode *mode, lower_env_t *env) {
 
        mtp = mode_is_signed(mode) ? binop_tp_s : binop_tp_u;
        opmode = get_irn_op_mode(node);
-       irn = get_intrinsic_address(mtp, get_irn_op(node), opmode, opmode, block, env);
+       irn = get_intrinsic_address(mtp, get_irn_op(node), opmode, opmode, env);
        call = new_rd_Call(dbg, block, get_Mod_mem(node), irn, 4, in, mtp);
        set_irn_pinned(call, get_irn_pinned(node));
        irn = new_r_Proj(block, call, mode_T, pn_Call_T_result);
@@ -654,7 +652,7 @@ static void lower_Mod(ir_node *node, ir_mode *mode, lower_env_t *env) {
                case pn_Mod_M:         /* Memory result. */
                        /* reroute to the call */
                        set_Proj_pred(proj, call);
-                       set_Proj_proj(proj, pn_Call_M_except);
+                       set_Proj_proj(proj, pn_Call_M);
                        break;
                case pn_Mod_X_except:  /* Execution result if exception occurred. */
                        /* reroute to the call */
@@ -737,7 +735,7 @@ static void lower_DivMod(ir_node *node, ir_mode *mode, lower_env_t *env) {
        mtp = mode_is_signed(mode) ? binop_tp_s : binop_tp_u;
        if (flags & 1) {
                opmode = get_irn_op_mode(node);
-               irn = get_intrinsic_address(mtp, op_Div, opmode, opmode, block, env);
+               irn = get_intrinsic_address(mtp, op_Div, opmode, opmode, env);
                callDiv = new_rd_Call(dbg, block, mem, irn, 4, in, mtp);
                set_irn_pinned(callDiv, get_irn_pinned(node));
                resDiv = new_r_Proj(block, callDiv, mode_T, pn_Call_T_result);
@@ -746,7 +744,7 @@ static void lower_DivMod(ir_node *node, ir_mode *mode, lower_env_t *env) {
                if (flags & 1)
                        mem = new_r_Proj(block, callDiv, mode_M, pn_Call_M);
                opmode = get_irn_op_mode(node);
-               irn = get_intrinsic_address(mtp, op_Mod, opmode, opmode, block, env);
+               irn = get_intrinsic_address(mtp, op_Mod, opmode, opmode, env);
                callMod = new_rd_Call(dbg, block, mem, irn, 4, in, mtp);
                set_irn_pinned(callMod, get_irn_pinned(node));
                resMod = new_r_Proj(block, callMod, mode_T, pn_Call_T_result);
@@ -757,7 +755,7 @@ static void lower_DivMod(ir_node *node, ir_mode *mode, lower_env_t *env) {
                case pn_DivMod_M:         /* Memory result. */
                        /* reroute to the first call */
                        set_Proj_pred(proj, callDiv ? callDiv : (callMod ? callMod : mem));
-                       set_Proj_proj(proj, pn_Call_M_except);
+                       set_Proj_proj(proj, pn_Call_M);
                        break;
                case pn_DivMod_X_except:  /* Execution result if exception occurred. */
                        /* reroute to the first call */
@@ -829,7 +827,7 @@ static void lower_Binop(ir_node *node, ir_mode *mode, lower_env_t *env) {
        irg   = current_ir_graph;
 
        mtp = mode_is_signed(mode) ? binop_tp_s : binop_tp_u;
-       irn = get_intrinsic_address(mtp, get_irn_op(node), mode, mode, block, env);
+       irn = get_intrinsic_address(mtp, get_irn_op(node), mode, mode, env);
        irn = new_rd_Call(dbg, block, get_irg_no_mem(current_ir_graph),
                irn, 4, in, mtp);
        set_irn_pinned(irn, get_irn_pinned(node));
@@ -876,7 +874,7 @@ static void lower_Shiftop(ir_node *node, ir_mode *mode, lower_env_t *env) {
        irg  = current_ir_graph;
 
        mtp = mode_is_signed(mode) ? shiftop_tp_s : shiftop_tp_u;
-       irn = get_intrinsic_address(mtp, get_irn_op(node), mode, mode, block, env);
+       irn = get_intrinsic_address(mtp, get_irn_op(node), mode, mode, env);
        irn = new_rd_Call(dbg, block, get_irg_no_mem(current_ir_graph),
                irn, 3, in, mtp);
        set_irn_pinned(irn, get_irn_pinned(node));
@@ -1112,7 +1110,7 @@ static void lower_Unop(ir_node *node, ir_mode *mode, lower_env_t *env) {
        block = get_nodes_block(node);
 
        mtp = mode_is_signed(mode) ? unop_tp_s : unop_tp_u;
-       irn = get_intrinsic_address(mtp, get_irn_op(node), mode, mode, block, env);
+       irn = get_intrinsic_address(mtp, get_irn_op(node), mode, mode, env);
        irn = new_rd_Call(dbg, block, get_irg_no_mem(current_ir_graph),
                irn, 2, in, mtp);
        set_irn_pinned(irn, get_irn_pinned(node));
@@ -1495,7 +1493,7 @@ static void lower_Conv_to_Ls(ir_node *node, lower_env_t *env) {
                ir_mode *omode = env->params->high_signed;
                ir_type *mtp = get_conv_type(imode, omode, env);
 
-               irn = get_intrinsic_address(mtp, get_irn_op(node), imode, omode, block, env);
+               irn = get_intrinsic_address(mtp, get_irn_op(node), imode, omode, env);
                call = new_rd_Call(dbg, block, get_irg_no_mem(irg), irn, 1, &op, mtp);
                set_irn_pinned(call, get_irn_pinned(node));
                irn = new_r_Proj(block, call, mode_T, pn_Call_T_result);
@@ -1551,7 +1549,7 @@ static void lower_Conv_to_Lu(ir_node *node, lower_env_t *env) {
                ir_type *mtp = get_conv_type(imode, omode, env);
 
                /* do an intrinsic call */
-               irn = get_intrinsic_address(mtp, get_irn_op(node), imode, omode, block, env);
+               irn = get_intrinsic_address(mtp, get_irn_op(node), imode, omode, env);
                call = new_rd_Call(dbg, block, get_irg_no_mem(irg), irn, 1, &op, mtp);
                set_irn_pinned(call, get_irn_pinned(node));
                irn = new_r_Proj(block, call, mode_T, pn_Call_T_result);
@@ -1593,7 +1591,7 @@ static void lower_Conv_from_Ls(ir_node *node, lower_env_t *env) {
                ir_mode *imode = env->params->high_signed;
                ir_type *mtp = get_conv_type(imode, omode, env);
 
-               irn = get_intrinsic_address(mtp, get_irn_op(node), imode, omode, block, env);
+               irn = get_intrinsic_address(mtp, get_irn_op(node), imode, omode, env);
                in[0] = env->entries[idx]->low_word;
                in[1] = env->entries[idx]->high_word;
 
@@ -1637,7 +1635,7 @@ static void lower_Conv_from_Lu(ir_node *node, lower_env_t *env) {
                ir_mode *imode = env->params->high_unsigned;
                ir_type *mtp = get_conv_type(imode, omode, env);
 
-               irn = get_intrinsic_address(mtp, get_irn_op(node), imode, omode, block, env);
+               irn = get_intrinsic_address(mtp, get_irn_op(node), imode, omode, env);
                in[0] = env->entries[idx]->low_word;
                in[1] = env->entries[idx]->high_word;
 
@@ -1958,7 +1956,6 @@ static void lower_Start(ir_node *node, ir_mode *mode, lower_env_t *env) {
  * Translate a Call.
  */
 static void lower_Call(ir_node *node, ir_mode *mode, lower_env_t *env) {
-       ir_graph *irg = current_ir_graph;
        ir_type  *tp = get_Call_type(node);
        ir_type  *call_tp;
        ir_node  **in, *proj, *results;
@@ -2687,6 +2684,31 @@ void lower_dw_ops(const lwrdw_param_t *param)
        current_ir_graph = rem;
 }  /* lower_dw_ops */
 
+struct pass_t {
+       ir_prog_pass_t      pass;
+       const lwrdw_param_t *param;
+};
+
+/**
+ * Creates a wrapper around lower_dw_ops().
+ */
+static int pass_wrapper(ir_prog *irp, void *context)
+{
+       struct pass_t *pass = context;
+
+       (void)irp;
+       lower_dw_ops(pass->param);
+       return 0;
+}
+
+ir_prog_pass_t *lower_dw_ops_pass(const char *name, const lwrdw_param_t *param) {
+       struct pass_t *pass = XMALLOCZ(struct pass_t);
+
+       pass->param = param;
+       return def_prog_pass_constructor(
+               &pass->pass, name ? name : "lower_dw", pass_wrapper);
+}  /* lower_dw_ops_pass */
+
 /* Default implementation. */
 ir_entity *def_create_intrinsic_fkt(ir_type *method, const ir_op *op,
                                     const ir_mode *imode, const ir_mode *omode,