- Improved addressmode optimisation for conv nodes
[libfirm] / ir / be / ia32 / ia32_intrinsics.c
index 436a889..52b0e95 100644 (file)
@@ -55,7 +55,7 @@ static void resolve_call(ir_node *call, ir_node *l_res, ir_node *h_res, ir_graph
        set_Tuple_pred(call, pn_Call_M_regular,        get_irg_no_mem(irg));
        set_Tuple_pred(call, pn_Call_X_except,         get_irg_bad(irg));
        set_Tuple_pred(call, pn_Call_T_result,         res);
-       set_Tuple_pred(call, pn_Call_M_except,         get_irg_bad(irg));
+       set_Tuple_pred(call, pn_Call_M_except,         get_irg_no_mem(irg));
        set_Tuple_pred(call, pn_Call_P_value_res_base, get_irg_bad(irg));
 }
 
@@ -135,6 +135,7 @@ static int map_Shl(ir_node *call, void *ctx) {
 
        /* l_res = SHL a_l, cnt */
        h_res = new_rd_ia32_l_Shl(dbg, irg, block, a_l, cnt, h_res_mode);
+       add_irn_dep(h_res, l_res);
 
        resolve_call(call, l_res, h_res, irg, block);
 
@@ -162,6 +163,7 @@ static int map_Shr(ir_node *call, void *ctx) {
 
        /* h_res = SHR a_h, cnt */
        h_res = new_rd_ia32_l_Shr(dbg, irg, block, a_h, cnt, h_res_mode);
+       add_irn_dep(h_res, l_res);
 
        resolve_call(call, l_res, h_res, irg, block);
 
@@ -189,6 +191,7 @@ static int map_Shrs(ir_node *call, void *ctx) {
 
        /* h_res = SAR a_h, cnt */
        h_res = new_rd_ia32_l_Shrs(dbg, irg, block, a_h, cnt, h_res_mode);
+       add_irn_dep(h_res, l_res);
 
        resolve_call(call, l_res, h_res, irg, block);
 
@@ -258,6 +261,7 @@ static int map_Minus(ir_node *call, void *ctx) {
        /* too bad: we need 0 in a register here */
        cnst  = new_Const_long(h_res_mode, 0);
        h_res = new_rd_ia32_l_SubC(dbg, irg, block, cnst, a_h, h_res_mode);
+       add_irn_dep(h_res, l_res);
 
        resolve_call(call, l_res, h_res, irg, block);
 
@@ -298,6 +302,7 @@ static int map_Abs(ir_node *call, void *ctx) {
        sub_h = new_rd_ia32_l_Eor(dbg, irg, block, a_h, sign, h_res_mode);
        l_res = new_rd_ia32_l_Sub(dbg, irg, block, sub_l, sign, l_res_mode);
        h_res = new_rd_ia32_l_SubC(dbg, irg, block, sub_h, sign, l_res_mode);
+       add_irn_dep(h_res, l_res);
 
        resolve_call(call, l_res, h_res, irg, block);