X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fia32%2Fia32_address_mode.c;h=8acfdbf5a63cdc369ccbc1d02c8acc8c4c569775;hb=41eca21e7add2e4f30f14c46600a23839852b3fc;hp=b83d3d4826f4ccbd51d74cf92a897142aa7eda55;hpb=1d2f83e16a809b6fee435845d3f3809fffaae29f;p=libfirm diff --git a/ir/be/ia32/ia32_address_mode.c b/ir/be/ia32/ia32_address_mode.c index b83d3d482..8acfdbf5a 100644 --- a/ir/be/ia32/ia32_address_mode.c +++ b/ir/be/ia32/ia32_address_mode.c @@ -43,7 +43,6 @@ /* gas/ld don't support negative symconsts :-( */ #undef SUPPORT_NEGATIVE_SYMCONSTS -static be_lv_t *lv; static bitset_t *non_address_mode_nodes; /** @@ -428,9 +427,9 @@ int ia32_is_non_address_mode_node(ir_node const *node) return bitset_is_set(non_address_mode_nodes, get_irn_idx(node)); } -static int value_last_used_here(ir_node *here, ir_node *value) +static int value_last_used_here(be_lv_t *lv, ir_node *here, ir_node *value) { - ir_node *block = get_nodes_block(here); + ir_node *block = get_nodes_block(here); const ir_edge_t *edge; /* If the value is live end it is for sure it does not die here */ @@ -455,12 +454,13 @@ static int value_last_used_here(ir_node *here, ir_node *value) */ static void mark_non_address_nodes(ir_node *node, void *env) { - int i, arity; + be_lv_t *lv = env; + int arity; + int i; ir_node *val; ir_node *left; ir_node *right; ir_mode *mode; - (void) env; mode = get_irn_mode(node); if (!mode_is_int(mode) && !mode_is_reference(mode) && mode != mode_b) @@ -475,7 +475,7 @@ static void mark_non_address_nodes(ir_node *node, void *env) case iro_Store: /* Do not mark the pointer, because we want to turn it into AM. */ val = get_Store_value(node); - bitset_set(non_address_mode_nodes, get_irn_idx(val)); + ia32_mark_non_am(val); break; case iro_Shl: @@ -497,15 +497,15 @@ static void mark_non_address_nodes(ir_node *node, void *env) * an addition and has the same register pressure for the case that only * one operand dies, but is faster (on Pentium 4). * && instead of || only folds AM if both operands do not die here */ - if (!value_last_used_here(node, left) || - !value_last_used_here(node, right)) { + if (!value_last_used_here(lv, node, left) || + !value_last_used_here(lv, node, right)) { return; } /* 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)); + ia32_mark_non_am(node); break; default: @@ -513,7 +513,7 @@ static void mark_non_address_nodes(ir_node *node, void *env) for (i = 0; i < arity; ++i) { ir_node *in = get_irn_n(node, i); - bitset_set(non_address_mode_nodes, get_irn_idx(in)); + ia32_mark_non_am(in); } break; } @@ -522,11 +522,11 @@ static void mark_non_address_nodes(ir_node *node, void *env) void ia32_calculate_non_address_mode_nodes(be_irg_t *birg) { ir_graph *irg = be_get_birg_irg(birg); + be_lv_t *lv = be_assure_liveness(birg); - lv = be_assure_liveness(birg); non_address_mode_nodes = bitset_malloc(get_irg_last_idx(irg)); - irg_walk_graph(irg, NULL, mark_non_address_nodes, NULL); + irg_walk_graph(irg, NULL, mark_non_address_nodes, lv); } void ia32_free_non_address_mode_nodes(void)