X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbera.c;h=024452ab7dc4cf69a2f971a5b593f7541710c026;hb=23b71abac8014aa6bfee3b47648fdb8fe8687b8f;hp=90ea5c9e2d5127b76b1e71dcfd38718db8083ae6;hpb=5c4c889a99e6bd23a35e108b4b4e9a6cbd9e695b;p=libfirm diff --git a/ir/be/bera.c b/ir/be/bera.c index 90ea5c9e2..024452ab7 100644 --- a/ir/be/bera.c +++ b/ir/be/bera.c @@ -55,9 +55,9 @@ int values_interfere(const ir_node *a, const ir_node *b) int b2a = value_dominates(b, a); /* If there is no dominance relation, they do not interfere. */ - if(a2b + b2a > 0) { + if((a2b | b2a) > 0) { const ir_edge_t *edge; - ir_node *bb = get_nodes_block(b); + ir_node *bb; /* * Adjust a and b so, that a dominates b if @@ -69,6 +69,8 @@ int values_interfere(const ir_node *a, const ir_node *b) b = t; } + bb = get_nodes_block(b); + /* * If a is live end in b's block it is * live at b's definition (a dominates b) @@ -80,7 +82,9 @@ int values_interfere(const ir_node *a, const ir_node *b) * Look at all usages of a. * If there's one usage of a in the block of b, then * we check, if this use is dominated by b, if that's true - * a and b interfere. + * a and b interfere. Note that b must strictly dominate the user, + * since if b is the last user of in the block, b and a do not + * interfere. * Uses of a not in b's block can be disobeyed, because the * check for a being live at the end of b's block is already * performed. @@ -89,6 +93,7 @@ int values_interfere(const ir_node *a, const ir_node *b) const ir_node *user = edge->src; if(get_nodes_block(user) == bb && !is_Phi(user) + && b != user && value_dominates(b, user)) return 1; }