From: Christoph Mallon Date: Tue, 23 Oct 2007 22:01:26 +0000 (+0000) Subject: Improve the AM folding heuristics: Do not fold AM if at least one of the AM operands... X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=d1fb00e4e6be827d758a141ef4c55472f518e854;p=libfirm Improve the AM folding heuristics: Do not fold AM if at least one of the AM operands is not used except for this address calculation. [r16324] --- diff --git a/ir/be/ia32/ia32_address_mode.c b/ir/be/ia32/ia32_address_mode.c index 79b6546f4..ac876fcdd 100644 --- a/ir/be/ia32/ia32_address_mode.c +++ b/ir/be/ia32/ia32_address_mode.c @@ -465,8 +465,8 @@ static void mark_non_address_nodes(ir_node *node, void *env) left = get_binop_left(node); right = get_binop_right(node); - /* live end: we won't save a register by AM folding */ - if(be_is_live_end(lv, block, left) || be_is_live_end(lv, block, right)) + /* If both are live end not folding AM costs a register */ + if(be_is_live_end(lv, block, left) && be_is_live_end(lv, block, right)) return; /* if multiple nodes in this block use left/right values, then we @@ -475,17 +475,19 @@ static void mark_non_address_nodes(ir_node *node, void *env) * calculations. */ foreach_out_edge(left, edge) { ir_node *user = get_edge_src_irn(edge); - if(user != node && get_nodes_block(user) == block) - return; - } - foreach_out_edge(right, edge) { - ir_node *user = get_edge_src_irn(edge); - if(user != node && get_nodes_block(user) == block) - return; + if(user != node && get_nodes_block(user) == block) { + foreach_out_edge(right, edge) { + ir_node *user = get_edge_src_irn(edge); + if(user != node && get_nodes_block(user) == block) + return; + } + break; + } } - /* noone-else in this block is using left/right so we'll reduce register - * pressure if we don't fold the node */ + /* At least one of left and right are not used by anyone else, so it is + * beneficial for the register pressure (if both are unused otherwise, + * else neutral) and ALU use to not fold AM. */ bitset_set(non_address_mode_nodes, get_irn_idx(node)); break;