X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firopt.c;h=03c707be0f1ab0e31fba994cffc973c7f709b7e8;hb=45dfabd3acda895e53c27e4e5095fc8caa945a56;hp=536eda61cf3af11976d56b97c3a83980945fc080;hpb=d367066554e7696b8faac47f06c17ba29b0cc040;p=libfirm diff --git a/ir/ir/iropt.c b/ir/ir/iropt.c index 536eda61c..03c707be0 100644 --- a/ir/ir/iropt.c +++ b/ir/ir/iropt.c @@ -1596,7 +1596,6 @@ static ir_node *equivalent_node_Proj_CopyB(ir_node *proj) { DBG_OPT_ALGSIM0(oldn, proj, FS_OPT_NOP); break; - case pn_CopyB_M_except: case pn_CopyB_X_except: DBG_OPT_EXC_REM(proj); proj = get_irg_bad(current_ir_graph); @@ -1956,11 +1955,18 @@ static int is_const_Phi(ir_node *n) { typedef tarval *(*tarval_sub_type)(tarval *a, tarval *b, ir_mode *mode); typedef tarval *(*tarval_binop_type)(tarval *a, tarval *b); +/** + * in reality eval_func should be tarval (*eval_func)() but incomplete + * declarations are bad style and generate noisy warnings + */ +typedef void (*eval_func)(void); + /** * Wrapper for the tarval binop evaluation, tarval_sub has one more parameter. */ -static tarval *do_eval(tarval *(*eval)(), tarval *a, tarval *b, ir_mode *mode) { - if (eval == tarval_sub) { +static tarval *do_eval(eval_func eval, tarval *a, tarval *b, ir_mode *mode) +{ + if (eval == (eval_func) tarval_sub) { tarval_sub_type func = (tarval_sub_type)eval; return func(a, b, mode); @@ -1982,7 +1988,7 @@ static tarval *do_eval(tarval *(*eval)(), tarval *a, tarval *b, ir_mode *mode) { * * @return a new Phi node if the conversion was successful, NULL else */ -static ir_node *apply_binop_on_phi(ir_node *phi, tarval *other, tarval *(*eval)(), ir_mode *mode, int left) { +static ir_node *apply_binop_on_phi(ir_node *phi, tarval *other, eval_func eval, ir_mode *mode, int left) { tarval *tv; void **res; ir_node *pred; @@ -2033,7 +2039,7 @@ static ir_node *apply_binop_on_phi(ir_node *phi, tarval *other, tarval *(*eval)( * * @return a new Phi node if the conversion was successful, NULL else */ -static ir_node *apply_binop_on_2_phis(ir_node *a, ir_node *b, tarval *(*eval)(), ir_mode *mode) { +static ir_node *apply_binop_on_2_phis(ir_node *a, ir_node *b, eval_func eval, ir_mode *mode) { tarval *tv_l, *tv_r, *tv; void **res; ir_node *pred; @@ -2274,7 +2280,7 @@ static ir_node *transform_node_Add(ir_node *n) { } } - HANDLE_BINOP_PHI(tarval_add, a, b, c, mode); + HANDLE_BINOP_PHI((eval_func) tarval_add, a, b, c, mode); /* for FP these optimizations are only allowed if fp_strict_algebraic is disabled */ if (mode_is_float(mode) && (get_irg_fp_model(current_ir_graph) & fp_strict_algebraic)) @@ -2406,7 +2412,7 @@ static ir_node *transform_node_Sub(ir_node *n) { } restart: - HANDLE_BINOP_PHI(tarval_sub, a, b, c, mode); + HANDLE_BINOP_PHI((eval_func) tarval_sub, a, b, c, mode); /* for FP these optimizations are only allowed if fp_strict_algebraic is disabled */ if (mode_is_float(mode) && (get_irg_fp_model(current_ir_graph) & fp_strict_algebraic)) @@ -2723,7 +2729,7 @@ static ir_node *transform_node_Mul(ir_node *n) { if (mode != get_irn_mode(a)) return transform_node_Mul2n(n, mode); - HANDLE_BINOP_PHI(tarval_mul, a, b, c, mode); + HANDLE_BINOP_PHI((eval_func) tarval_mul, a, b, c, mode); if (mode_is_signed(mode)) { ir_node *r = NULL; @@ -2835,7 +2841,7 @@ static ir_node *transform_node_Div(ir_node *n) { if (is_Const(b) && is_const_Phi(a)) { /* check for Div(Phi, Const) */ - value = apply_binop_on_phi(a, get_Const_tarval(b), tarval_div, mode, 0); + value = apply_binop_on_phi(a, get_Const_tarval(b), (eval_func) tarval_div, mode, 0); if (value) { DBG_OPT_ALGSIM0(n, value, FS_OPT_CONST_PHI); goto make_tuple; @@ -2843,7 +2849,7 @@ static ir_node *transform_node_Div(ir_node *n) { } else if (is_Const(a) && is_const_Phi(b)) { /* check for Div(Const, Phi) */ - value = apply_binop_on_phi(b, get_Const_tarval(a), tarval_div, mode, 1); + value = apply_binop_on_phi(b, get_Const_tarval(a), (eval_func) tarval_div, mode, 1); if (value) { DBG_OPT_ALGSIM0(n, value, FS_OPT_CONST_PHI); goto make_tuple; @@ -2851,7 +2857,7 @@ static ir_node *transform_node_Div(ir_node *n) { } else if (is_const_Phi(a) && is_const_Phi(b)) { /* check for Div(Phi, Phi) */ - value = apply_binop_on_2_phis(a, b, tarval_div, mode); + value = apply_binop_on_2_phis(a, b, (eval_func) tarval_div, mode); if (value) { DBG_OPT_ALGSIM0(n, value, FS_OPT_CONST_PHI); goto make_tuple; @@ -2911,7 +2917,7 @@ static ir_node *transform_node_Mod(ir_node *n) { if (is_Const(b) && is_const_Phi(a)) { /* check for Div(Phi, Const) */ - value = apply_binop_on_phi(a, get_Const_tarval(b), tarval_mod, mode, 0); + value = apply_binop_on_phi(a, get_Const_tarval(b), (eval_func) tarval_mod, mode, 0); if (value) { DBG_OPT_ALGSIM0(n, value, FS_OPT_CONST_PHI); goto make_tuple; @@ -2919,7 +2925,7 @@ static ir_node *transform_node_Mod(ir_node *n) { } else if (is_Const(a) && is_const_Phi(b)) { /* check for Div(Const, Phi) */ - value = apply_binop_on_phi(b, get_Const_tarval(a), tarval_mod, mode, 1); + value = apply_binop_on_phi(b, get_Const_tarval(a), (eval_func) tarval_mod, mode, 1); if (value) { DBG_OPT_ALGSIM0(n, value, FS_OPT_CONST_PHI); goto make_tuple; @@ -2927,7 +2933,7 @@ static ir_node *transform_node_Mod(ir_node *n) { } else if (is_const_Phi(a) && is_const_Phi(b)) { /* check for Div(Phi, Phi) */ - value = apply_binop_on_2_phis(a, b, tarval_mod, mode); + value = apply_binop_on_2_phis(a, b, (eval_func) tarval_mod, mode); if (value) { DBG_OPT_ALGSIM0(n, value, FS_OPT_CONST_PHI); goto make_tuple; @@ -3000,8 +3006,8 @@ static ir_node *transform_node_DivMod(ir_node *n) { if (is_Const(b) && is_const_Phi(a)) { /* check for Div(Phi, Const) */ - va = apply_binop_on_phi(a, get_Const_tarval(b), tarval_div, mode, 0); - vb = apply_binop_on_phi(a, get_Const_tarval(b), tarval_mod, mode, 0); + va = apply_binop_on_phi(a, get_Const_tarval(b), (eval_func) tarval_div, mode, 0); + vb = apply_binop_on_phi(a, get_Const_tarval(b), (eval_func) tarval_mod, mode, 0); if (va && vb) { DBG_OPT_ALGSIM0(n, va, FS_OPT_CONST_PHI); DBG_OPT_ALGSIM0(n, vb, FS_OPT_CONST_PHI); @@ -3010,8 +3016,8 @@ static ir_node *transform_node_DivMod(ir_node *n) { } else if (is_Const(a) && is_const_Phi(b)) { /* check for Div(Const, Phi) */ - va = apply_binop_on_phi(b, get_Const_tarval(a), tarval_div, mode, 1); - vb = apply_binop_on_phi(b, get_Const_tarval(a), tarval_mod, mode, 1); + va = apply_binop_on_phi(b, get_Const_tarval(a), (eval_func) tarval_div, mode, 1); + vb = apply_binop_on_phi(b, get_Const_tarval(a), (eval_func) tarval_mod, mode, 1); if (va && vb) { DBG_OPT_ALGSIM0(n, va, FS_OPT_CONST_PHI); DBG_OPT_ALGSIM0(n, vb, FS_OPT_CONST_PHI); @@ -3020,8 +3026,8 @@ static ir_node *transform_node_DivMod(ir_node *n) { } else if (is_const_Phi(a) && is_const_Phi(b)) { /* check for Div(Phi, Phi) */ - va = apply_binop_on_2_phis(a, b, tarval_div, mode); - vb = apply_binop_on_2_phis(a, b, tarval_mod, mode); + va = apply_binop_on_2_phis(a, b, (eval_func) tarval_div, mode); + vb = apply_binop_on_2_phis(a, b, (eval_func) tarval_mod, mode); if (va && vb) { DBG_OPT_ALGSIM0(n, va, FS_OPT_CONST_PHI); DBG_OPT_ALGSIM0(n, vb, FS_OPT_CONST_PHI); @@ -3377,7 +3383,7 @@ static ir_node *transform_node_And(ir_node *n) { ir_mode *mode; mode = get_irn_mode(n); - HANDLE_BINOP_PHI(tarval_and, a, b, c, mode); + HANDLE_BINOP_PHI((eval_func) tarval_and, a, b, c, mode); /* we can evaluate 2 Projs of the same Cmp */ if (mode == mode_b && is_Proj(a) && is_Proj(b)) { @@ -3509,7 +3515,7 @@ static ir_node *transform_node_Eor(ir_node *n) { ir_node *b = get_Eor_right(n); ir_mode *mode = get_irn_mode(n); - HANDLE_BINOP_PHI(tarval_eor, a, b, c, mode); + HANDLE_BINOP_PHI((eval_func) tarval_eor, a, b, c, mode); /* we can evaluate 2 Projs of the same Cmp */ if (mode == mode_b && is_Proj(a) && is_Proj(b)) { @@ -3532,15 +3538,6 @@ static ir_node *transform_node_Eor(ir_node *n) { n = new_rd_Const(get_irn_dbg_info(n), current_ir_graph, get_mode_null(mode)); DBG_OPT_ALGSIM0(oldn, n, FS_OPT_EOR_A_A); - } else if (mode == mode_b && - is_Proj(a) && - is_Const(b) && is_Const_one(b) && - is_Cmp(get_Proj_pred(a))) { - /* The Eor negates a Cmp. The Cmp has the negated result anyways! */ - n = new_r_Proj(get_nodes_block(n), get_Proj_pred(a), - mode_b, get_negated_pnc(get_Proj_proj(a), mode)); - - DBG_OPT_ALGSIM0(oldn, n, FS_OPT_EOR_TO_NOT_BOOL); } else if (is_Const(b)) { if (is_Not(a)) { /* ~x ^ const -> x ^ ~const */ ir_node *cnst = new_Const(tarval_not(get_Const_tarval(b))); @@ -4654,7 +4651,6 @@ static ir_node *transform_node_Proj_CopyB(ir_node *proj) { DBG_OPT_EXC_REM(proj); proj = new_r_Jmp(get_nodes_block(copyb)); break; - case pn_CopyB_M_except: case pn_CopyB_X_except: DBG_OPT_EXC_REM(proj); proj = get_irg_bad(get_irn_irg(proj)); @@ -4820,7 +4816,7 @@ static ir_node *transform_node_Or_bf_store(ir_node *or) { ir_node *new_and, *new_const, *block; ir_mode *mode = get_irn_mode(or); - tarval *tv1, *tv2, *tv3, *tv4, *tv, *n_tv4, *n_tv2; + tarval *tv1, *tv2, *tv3, *tv4, *tv; while (1) { get_comm_Binop_Ops(or, &and, &c1); @@ -4869,14 +4865,12 @@ static ir_node *transform_node_Or_bf_store(ir_node *or) { return or; } - n_tv4 = tarval_not(tv4); - if (tv3 != tarval_and(tv3, n_tv4)) { + if (tv3 != tarval_andnot(tv3, tv4)) { /* bit in the or_mask is outside the and_mask */ return or; } - n_tv2 = tarval_not(tv2); - if (tv1 != tarval_and(tv1, n_tv2)) { + if (tv1 != tarval_andnot(tv1, tv2)) { /* bit in the or_mask is outside the and_mask */ return or; } @@ -5022,7 +5016,7 @@ static ir_node *transform_node_Or(ir_node *n) { } mode = get_irn_mode(n); - HANDLE_BINOP_PHI(tarval_or, a, b, c, mode); + HANDLE_BINOP_PHI((eval_func) tarval_or, a, b, c, mode); n = transform_node_Or_bf_store(n); n = transform_node_Or_Rotl(n); @@ -5299,7 +5293,7 @@ static ir_node *transform_node_Shr(ir_node *n) { ir_node *right = get_Shr_right(n); ir_mode *mode = get_irn_mode(n); - HANDLE_BINOP_PHI(tarval_shr, left, right, c, mode); + HANDLE_BINOP_PHI((eval_func) tarval_shr, left, right, c, mode); n = transform_node_shift(n); if (is_Shr(n)) @@ -5319,7 +5313,7 @@ static ir_node *transform_node_Shrs(ir_node *n) { ir_node *b = get_Shrs_right(n); ir_mode *mode = get_irn_mode(n); - HANDLE_BINOP_PHI(tarval_shrs, a, b, c, mode); + HANDLE_BINOP_PHI((eval_func) tarval_shrs, a, b, c, mode); n = transform_node_shift(n); if (is_Shrs(n)) @@ -5337,7 +5331,7 @@ static ir_node *transform_node_Shl(ir_node *n) { ir_node *b = get_Shl_right(n); ir_mode *mode = get_irn_mode(n); - HANDLE_BINOP_PHI(tarval_shl, a, b, c, mode); + HANDLE_BINOP_PHI((eval_func) tarval_shl, a, b, c, mode); n = transform_node_shift(n); if (is_Shl(n)) @@ -5357,7 +5351,7 @@ static ir_node *transform_node_Rotl(ir_node *n) { ir_node *b = get_Rotl_right(n); ir_mode *mode = get_irn_mode(n); - HANDLE_BINOP_PHI(tarval_rotl, a, b, c, mode); + HANDLE_BINOP_PHI((eval_func) tarval_rotl, a, b, c, mode); n = transform_node_shift(n); if (is_Rotl(n)) @@ -5791,7 +5785,7 @@ static ir_node *transform_node_Call(ir_node *call) { ir_node *callee = get_Call_ptr(call); ir_node *adr, *mem, *res, *bl, **in; ir_type *ctp, *mtp, *tp; - ident *id; + type_dbg_info *tdb; dbg_info *db; int i, n_res, n_param; ir_variadicity var; @@ -5813,13 +5807,11 @@ static ir_node *transform_node_Call(ir_node *call) { /* build a new call type */ mtp = get_Call_type(call); - id = get_type_ident(mtp); - id = id_mangle(new_id_from_chars("T_", 2), id); - db = get_type_dbg_info(mtp); + tdb = get_type_dbg_info(mtp); n_res = get_method_n_ress(mtp); n_param = get_method_n_params(mtp); - ctp = new_d_type_method(id, n_param + 1, n_res, db); + ctp = new_d_type_method(n_param + 1, n_res, tdb); for (i = 0; i < n_res; ++i) set_method_res_type(ctp, i, get_method_res_type(mtp, i)); @@ -5828,8 +5820,7 @@ static ir_node *transform_node_Call(ir_node *call) { /* FIXME: we don't need a new pointer type in every step */ tp = get_irg_frame_type(current_ir_graph); - id = id_mangle(get_type_ident(tp), new_id_from_chars("_ptr", 4)); - tp = new_type_pointer(id, tp, mode_P_data); + tp = new_type_pointer(tp); set_method_param_type(ctp, 0, tp); in[0] = get_Builtin_param(callee, 2); @@ -6365,19 +6356,22 @@ static void update_known_irn(ir_node *known_irn, const ir_node *new_ir_node) { * node could be found */ ir_node *identify_remember(pset *value_table, ir_node *n) { - ir_node *o = NULL; + ir_node *nn = NULL; if (!value_table) return n; ir_normalize_node(n); /* lookup or insert in hash table with given hash key. */ - o = pset_insert(value_table, n, ir_node_hash(n)); + nn = pset_insert(value_table, n, ir_node_hash(n)); + + if (nn != n) { + update_known_irn(nn, n); - if (o != n) { - update_known_irn(o, n); + /* n is reachable again */ + edges_node_revival(nn, get_irn_irg(nn)); } - return o; + return nn; } /* identify_remember */ /**