From 1bfbc8f331c7bdd37e533bd3d3dbdc4f9f2f398f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christian=20W=C3=BCrdig?= Date: Thu, 23 Feb 2006 16:02:22 +0000 Subject: [PATCH] fixed some bugs --- ir/be/ia32/ia32_new_nodes.c | 8 +++++-- ir/be/ia32/ia32_optimize.c | 43 ++++++++++++++++++++++++++++++------- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/ir/be/ia32/ia32_new_nodes.c b/ir/be/ia32/ia32_new_nodes.c index 3d8905782..9d836677c 100644 --- a/ir/be/ia32/ia32_new_nodes.c +++ b/ir/be/ia32/ia32_new_nodes.c @@ -429,6 +429,10 @@ char *get_ia32_am_offs(const ir_node *node) { char *res = NULL; int size; + if (! attr->am_offs) { + return NULL; + } + size = obstack_object_size(attr->am_offs); if (size > 0) { res = xcalloc(1, size + 1); @@ -738,14 +742,14 @@ void set_ia32_Immop_attr(ir_node *node, ir_node *cnst) { assert((is_ia32_Const(cnst) || is_ia32_fConst(cnst)) && "Need ia32_Const to set Immop attr"); - na->tp = ca->tp; na->tv = ca->tv; if (ca->sc) { na->sc = copy_str(na->sc, ca->sc); } else { - na->sc = NULL; + na->cnst = set_cnst_from_tv(na->cnst, na->tv); + na->sc = NULL; } } diff --git a/ir/be/ia32/ia32_optimize.c b/ir/be/ia32/ia32_optimize.c index 5f5349452..0bbca13b7 100644 --- a/ir/be/ia32/ia32_optimize.c +++ b/ir/be/ia32/ia32_optimize.c @@ -255,6 +255,28 @@ static ir_node *get_mem_proj(const ir_node *irn) { return NULL; } +/** + * Returns the Proj with number 0 connected to irn. + */ +static ir_node *get_res_proj(const ir_node *irn) { + const ir_edge_t *edge; + ir_node *src; + + assert(get_irn_mode(irn) == mode_T && "expected mode_T node"); + + foreach_out_edge(irn, edge) { + src = get_edge_src_irn(edge); + + assert(is_Proj(src) && "Proj expected"); + + if (get_Proj_proj(src) == 0) + return src; + } + + return NULL; +} + + /** * Determines if irn is a Proj and if is_op_func returns true for it's predecessor. */ @@ -294,6 +316,8 @@ static ir_node *fold_addr(ir_node *irn, firm_dbg_module_t *mod, ir_node *noreg) if (isadd) { /* put LEA == ia32_am_O as right operand */ if (is_ia32_Lea(left) && get_ia32_am_flavour(left) == ia32_am_O) { + set_irn_n(irn, 2, right); + set_irn_n(irn, 3, left); temp = left; left = right; right = temp; @@ -301,6 +325,8 @@ static ir_node *fold_addr(ir_node *irn, firm_dbg_module_t *mod, ir_node *noreg) /* put LEA != ia32_am_O as left operand */ if (is_ia32_Lea(right) && get_ia32_am_flavour(right) != ia32_am_O) { + set_irn_n(irn, 2, right); + set_irn_n(irn, 3, left); temp = left; left = right; right = temp; @@ -308,6 +334,8 @@ static ir_node *fold_addr(ir_node *irn, firm_dbg_module_t *mod, ir_node *noreg) /* put SHL as right operand */ if (pred_is_specific_node(left, is_ia32_Shl)) { + set_irn_n(irn, 2, right); + set_irn_n(irn, 3, left); temp = left; left = right; right = temp; @@ -409,6 +437,11 @@ static ir_node *fold_addr(ir_node *irn, firm_dbg_module_t *mod, ir_node *noreg) DBG((mod, LEVEL_1, "\tLEA [%+F + %+F * %d + %s]\n", base, index, scale, get_ia32_am_offs(res))); + /* get the result Proj of the Add/Sub */ + irn = get_res_proj(irn); + + assert(irn && "Couldn't find result proj"); + /* exchange the old op with the new LEA */ exchange(irn, res); } @@ -536,14 +569,8 @@ void ia32_optimize_am(ir_node *irn, void *env) { /* check further, otherwise we check for Store and remember the address, */ /* the Store points to. */ - succ = get_edge_src_irn(get_irn_out_edge_first(irn)); - assert(is_Proj(succ) && "successor of AM node is not Proj"); - - if (get_Proj_proj(succ) != 0) { - succ = get_edge_src_irn(get_irn_out_edge_next(irn, get_irn_out_edge_first(irn))); - assert(is_Proj(succ) && "successor of AM node is not Proj"); - assert(get_Proj_proj(succ) == 0 && "Couldn't find result proj"); - } + succ = get_res_proj(irn); + assert(succ && "Couldn't find result proj"); addr_b = NULL; addr_i = NULL; -- 2.20.1