X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firopt.c;h=348f93e6365b6a08089b1e6e4d6cfcc82b129741;hb=3db23eee84cbabb3f399f1ca820948114a9c837c;hp=5ef18d2a8780313e55fd9ad89da8a181a6147027;hpb=d143d7f26df82f5504cdeb07732574ffd1175cdb;p=libfirm diff --git a/ir/ir/iropt.c b/ir/ir/iropt.c index 5ef18d2a8..348f93e63 100644 --- a/ir/ir/iropt.c +++ b/ir/ir/iropt.c @@ -182,48 +182,6 @@ static ir_tarval *computed_value_Sub(const ir_node *n) return tarval_bad; } -/** - * Return the value of a Carry. - * Special : a op 0, 0 op b - */ -static ir_tarval *computed_value_Carry(const ir_node *n) -{ - ir_node *a = get_binop_left(n); - ir_node *b = get_binop_right(n); - ir_mode *m = get_irn_mode(n); - ir_tarval *ta = value_of(a); - ir_tarval *tb = value_of(b); - - if ((ta != tarval_bad) && (tb != tarval_bad)) { - tarval_add(ta, tb); - return tarval_carry() ? get_mode_one(m) : get_mode_null(m); - } else { - if (tarval_is_null(ta) || tarval_is_null(tb)) - return get_mode_null(m); - } - return tarval_bad; -} - -/** - * Return the value of a Borrow. - * Special : a op 0 - */ -static ir_tarval *computed_value_Borrow(const ir_node *n) -{ - ir_node *a = get_binop_left(n); - ir_node *b = get_binop_right(n); - ir_mode *m = get_irn_mode(n); - ir_tarval *ta = value_of(a); - ir_tarval *tb = value_of(b); - - if ((ta != tarval_bad) && (tb != tarval_bad)) { - return tarval_cmp(ta, tb) == ir_relation_less ? get_mode_one(m) : get_mode_null(m); - } else if (tarval_is_null(ta)) { - return get_mode_null(m); - } - return tarval_bad; -} - /** * Return the value of an unary Minus. */ @@ -1235,56 +1193,6 @@ static ir_node *equivalent_node_Proj_CopyB(ir_node *proj) return proj; } -/** - * Optimize Bounds(idx, idx, upper) into idx. - */ -static ir_node *equivalent_node_Proj_Bound(ir_node *proj) -{ - ir_node *oldn = proj; - ir_node *bound = get_Proj_pred(proj); - ir_node *idx = get_Bound_index(bound); - ir_node *pred = skip_Proj(idx); - int ret_tuple = 0; - - if (idx == get_Bound_lower(bound)) - ret_tuple = 1; - else if (is_Bound(pred)) { - /* - * idx was Bounds checked previously, it is still valid if - * lower <= pred_lower && pred_upper <= upper. - */ - ir_node *lower = get_Bound_lower(bound); - ir_node *upper = get_Bound_upper(bound); - if (get_Bound_lower(pred) == lower && - get_Bound_upper(pred) == upper) { - /* - * One could expect that we simply return the previous - * Bound here. However, this would be wrong, as we could - * add an exception Proj to a new location then. - * So, we must turn in into a tuple. - */ - ret_tuple = 1; - } - } - if (ret_tuple) { - /* Turn Bound into a tuple (mem, jmp, bad, idx) */ - switch (get_Proj_proj(proj)) { - case pn_Bound_M: - DBG_OPT_EXC_REM(proj); - proj = get_Bound_mem(bound); - break; - case pn_Bound_res: - proj = idx; - DBG_OPT_ALGSIM0(oldn, proj, FS_OPT_NOP); - break; - default: - /* cannot optimize pn_Bound_X_regular, handled in transform ... */ - break; - } - } - return proj; -} - /** * Does all optimizations on nodes that must be done on its Projs * because of creating new nodes. @@ -2168,7 +2076,6 @@ static ir_node *transform_node_bitop_shift(ir_node *n) return n; } - irg = get_irn_irg(n); block = get_nodes_block(n); dbg_bitop = get_irn_dbg_info(n); dbg_shift = get_irn_dbg_info(left); @@ -3177,11 +3084,13 @@ make_tuple: /* skip a potential Pin */ mem = skip_Pin(mem); - turn_into_tuple(n, pn_Div_max+1); - set_Tuple_pred(n, pn_Div_M, mem); - set_Tuple_pred(n, pn_Div_X_regular, new_r_Jmp(blk)); - set_Tuple_pred(n, pn_Div_X_except, new_r_Bad(irg, mode_X)); - set_Tuple_pred(n, pn_Div_res, value); + ir_node *const in[] = { + [pn_Div_M] = mem, + [pn_Div_res] = value, + [pn_Div_X_regular] = new_r_Jmp(blk), + [pn_Div_X_except] = new_r_Bad(irg, mode_X), + }; + turn_into_tuple(n, ARRAY_SIZE(in), in); } return n; } @@ -3269,11 +3178,13 @@ make_tuple: /* skip a potential Pin */ mem = skip_Pin(mem); - turn_into_tuple(n, pn_Mod_max+1); - set_Tuple_pred(n, pn_Mod_M, mem); - set_Tuple_pred(n, pn_Mod_X_regular, new_r_Jmp(blk)); - set_Tuple_pred(n, pn_Mod_X_except, new_r_Bad(irg, mode_X)); - set_Tuple_pred(n, pn_Mod_res, value); + ir_node *const in[] = { + [pn_Mod_M] = mem, + [pn_Mod_res] = value, + [pn_Mod_X_regular] = new_r_Jmp(blk), + [pn_Mod_X_except] = new_r_Bad(irg, mode_X), + }; + turn_into_tuple(n, ARRAY_SIZE(in), in); } return n; } @@ -3289,7 +3200,6 @@ static ir_node *transform_node_Cond(ir_node *n) ir_node *a = get_Cond_selector(n); ir_graph *irg = get_irn_irg(n); ir_tarval *ta; - ir_node *jmp; /* we need block info which is not available in floating irgs */ if (get_irg_pinned(irg) == op_pin_state_floats) @@ -3305,16 +3215,15 @@ static ir_node *transform_node_Cond(ir_node *n) if (ta != tarval_bad) { /* It's branching on a boolean constant. Replace it by a tuple (Bad, Jmp) or (Jmp, Bad) */ - ir_node *blk = get_nodes_block(n); - jmp = new_r_Jmp(blk); - turn_into_tuple(n, pn_Cond_max+1); - if (ta == tarval_b_true) { - set_Tuple_pred(n, pn_Cond_false, new_r_Bad(irg, mode_X)); - set_Tuple_pred(n, pn_Cond_true, jmp); - } else { - set_Tuple_pred(n, pn_Cond_false, jmp); - set_Tuple_pred(n, pn_Cond_true, new_r_Bad(irg, mode_X)); - } + ir_node *const blk = get_nodes_block(n); + ir_node *const jmp = new_r_Jmp(blk); + ir_node *const bad = new_r_Bad(irg, mode_X); + bool const cond = ta == tarval_b_true; + ir_node *const in[] = { + [pn_Cond_false] = cond ? bad : jmp, + [pn_Cond_true] = cond ? jmp : bad, + }; + turn_into_tuple(n, ARRAY_SIZE(in), in); clear_irg_properties(irg, IR_GRAPH_PROPERTY_NO_UNREACHABLE_CODE); } return n; @@ -4805,63 +4714,6 @@ static ir_node *transform_node_Proj_CopyB(ir_node *proj) return proj; } -/** - * Optimize Bounds(idx, idx, upper) into idx. - */ -static ir_node *transform_node_Proj_Bound(ir_node *proj) -{ - ir_node *oldn = proj; - ir_node *bound = get_Proj_pred(proj); - ir_node *idx = get_Bound_index(bound); - ir_node *pred = skip_Proj(idx); - int ret_tuple = 0; - - if (idx == get_Bound_lower(bound)) - ret_tuple = 1; - else if (is_Bound(pred)) { - /* - * idx was Bounds checked previously, it is still valid if - * lower <= pred_lower && pred_upper <= upper. - */ - ir_node *lower = get_Bound_lower(bound); - ir_node *upper = get_Bound_upper(bound); - if (get_Bound_lower(pred) == lower && - get_Bound_upper(pred) == upper) { - /* - * One could expect that we simply return the previous - * Bound here. However, this would be wrong, as we could - * add an exception Proj to a new location then. - * So, we must turn in into a tuple. - */ - ret_tuple = 1; - } - } - if (ret_tuple) { - /* Turn Bound into a tuple (mem, jmp, bad, idx) */ - switch (get_Proj_proj(proj)) { - case pn_Bound_M: - DBG_OPT_EXC_REM(proj); - proj = get_Bound_mem(bound); - break; - case pn_Bound_X_except: - DBG_OPT_EXC_REM(proj); - proj = new_r_Bad(get_irn_irg(proj), mode_X); - break; - case pn_Bound_res: - proj = idx; - DBG_OPT_ALGSIM0(oldn, proj, FS_OPT_NOP); - break; - case pn_Bound_X_regular: - DBG_OPT_EXC_REM(proj); - proj = new_r_Jmp(get_nodes_block(bound)); - break; - default: - break; - } - } - return proj; -} - /** * Does all optimizations on nodes that must be done on its Projs * because of creating new nodes. @@ -6289,8 +6141,6 @@ void ir_register_opt_node_ops(void) { register_computed_value_func(op_Add, computed_value_Add); register_computed_value_func(op_And, computed_value_And); - register_computed_value_func(op_Borrow, computed_value_Borrow); - register_computed_value_func(op_Carry, computed_value_Carry); register_computed_value_func(op_Cmp, computed_value_Cmp); register_computed_value_func(op_Confirm, computed_value_Confirm); register_computed_value_func(op_Const, computed_value_Const); @@ -6329,7 +6179,6 @@ void ir_register_opt_node_ops(void) register_equivalent_node_func(op_Shr, equivalent_node_left_zero); register_equivalent_node_func(op_Shrs, equivalent_node_left_zero); register_equivalent_node_func(op_Sub, equivalent_node_Sub); - register_equivalent_node_func_proj(op_Bound, equivalent_node_Proj_Bound); register_equivalent_node_func_proj(op_CopyB, equivalent_node_Proj_CopyB); register_equivalent_node_func_proj(op_Div, equivalent_node_Proj_Div); register_equivalent_node_func_proj(op_Tuple, equivalent_node_Proj_Tuple); @@ -6361,7 +6210,6 @@ void ir_register_opt_node_ops(void) register_transform_node_func(op_Sub, transform_node_Sub); register_transform_node_func(op_Switch, transform_node_Switch); register_transform_node_func(op_Sync, transform_node_Sync); - register_transform_node_func_proj(op_Bound, transform_node_Proj_Bound); register_transform_node_func_proj(op_CopyB, transform_node_Proj_CopyB); register_transform_node_func_proj(op_Div, transform_node_Proj_Div); register_transform_node_func_proj(op_Load, transform_node_Proj_Load);